博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
07.Easymock的实际应用
阅读量:5946 次
发布时间:2019-06-19

本文共 9156 字,大约阅读时间需要 30 分钟。

第一步下载对应的java包添加到工程中

并静态导入所需要的j类

import static org.easymock.EasyMock.*;

这里有的注意点

package com.fjnu.service;import java.util.HashMap;import java.util.Map;import com.fjnu.model.User;import com.weiyuan.dao.IUserDao;import com.weiyuan.dao.UserDao;public class UserService implements IUserService {        private IUserDao userDao;                public UserService(IUserDao userDao) {        super();        this.userDao = userDao;    }            public UserService() {        super();    }    @Override    public void add(User user)  {        // TODO Auto-generated method stub        if(load(user.getUsername()) != null){            try {                throw new Exception("用户名已存在");            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }                    }        userDao.addUser(user);    }    @Override    public void delete(String username) {        // TODO Auto-generated method stub        userDao.deleteUser(username);    }    @Override    public User load(String username) {        // TODO Auto-generated method stub        return userDao.load(username);    }    @Override    public User login(String username, String password) {        // TODO Auto-generated method stub        return null;    }}

原来的业务代码在上面的部分不存在问题

我们添加联系人的时候:交互的流程是如果联系人存在我们就抛出联系人存在的异常,不执行后续的登录操作

但是上面的代码,我们知道联系人存在之后 throw new Exception("用户名已存在");但是这个异常又被try catch处理了,等于没有抛出任何异常等于打印了日志

上面的代码应该修改为下面的形式

我们在easymock进行测试的时候代码就会报错,说明业务逻辑方法存在问题,需要进行修改

/***         * 验证添加操作的时候用户已经存在         * @throws Exception          * */        @Test(expected = Exception.class)        public void testAddExits() throws Exception{            //第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常            expect(userDao.load("admin")).andReturn(baseUser);            //第二步添加联系人            userDao.addUser(baseUser);            expectLastCall();            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            userService.add(baseUser);            verify(userDao);                            }

运行报错

如果联系人存在需要抛出异常,但是上面的代码没有抛出任何异常,所以报错,代码应该修改为

package com.fjnu.service;import java.util.HashMap;import java.util.Map;import com.fjnu.model.User;import com.weiyuan.dao.IUserDao;import com.weiyuan.dao.UserDao;public class UserService implements IUserService {        private IUserDao userDao;                public UserService(IUserDao userDao) {        super();        this.userDao = userDao;    }            public UserService() {        super();    }    @Override    public void add(User user)  {        // TODO Auto-generated method stub        if(load(user.getUsername()) != null){            throw new RuntimeException("用户名已经存在");                    }        userDao.addUser(user);    }    @Override    public void delete(String username) {        // TODO Auto-generated method stub        userDao.deleteUser(username);    }    @Override    public User load(String username) {        // TODO Auto-generated method stub        return userDao.load(username);    }    @Override    public User login(String username, String password) {        // TODO Auto-generated method stub        return null;    }}

接下来我们验证登陆操作的业务交互,登陆操作的业务交互分为三种情况,第一登陆成功,第二登陆失败原因用户名不存在,第三种情况登陆成功密码错误

如何实现了

package com.fjnu.service;import java.util.HashMap;import java.util.Map;import com.fjnu.model.User;import com.weiyuan.dao.IUserDao;import com.weiyuan.dao.UserDao;public class UserService implements IUserService {        private IUserDao userDao;                public UserService(IUserDao userDao) {        super();        this.userDao = userDao;    }            public UserService() {        super();    }    @Override    public void add(User user)  {        // TODO Auto-generated method stub        if(load(user.getUsername()) != null){            throw new RuntimeException("用户名已经存在");                    }        userDao.addUser(user);    }    @Override    public void delete(String username) {        // TODO Auto-generated method stub        userDao.deleteUser(username);    }    @Override    public User load(String username) {        // TODO Auto-generated method stub        return userDao.load(username);    }    @Override    public User login(String username, String password) {        // TODO Auto-generated method stub        //第一步去通过用户名去查询用户是否存在        User load = userDao.load(username);        if(load == null){            throw new RuntimeException("用户名不存在");        }        //比较密码是否相等        if(!load.getPassword().equalsIgnoreCase(password)){            throw new RuntimeException("密码不成功");        }        return load;    }}

我们来看easymock的代码

package com.fjnu.service;import org.easymock.EasyMock;import org.junit.Before;import org.junit.Test;import static org.junit.Assert.*;import static org.easymock.EasyMock.*;  import com.fjnu.model.User;import com.weiyuan.dao.IUserDao;/** * mock代码是测试人员编写 * 1、这里测试的是操作联系人的业务类UserService的业务操作流程是否正确 * 2、UserService操作需要具体的userdao,但是userdao可能还正在开发中, * 我们只需要知道userdao的接口对象IUserDao,我们就可以使用mock模拟创建一个具体userdao类,提供给userserice使用 * 3、使用easymock我们验证的是userservice的业务交互流程是否正确,验证的是业务的交互流程 * */public class TestUserServiceByEasymock {    private IUserService userService;    private IUserDao userDao;    private User baseUser;        @Before    public void setUp(){        //创建所需要的mock对象        userDao =EasyMock.createStrictMock(IUserDao.class);        userService = new UserService(userDao);        baseUser = new User("admin", "123", "超级管理员878");    }        private void assertUserEquals (User u, User tu){        assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());        assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());        assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());    }        //测试查询操作是否成功    @Test    public void testLoad(){        expect(userDao.load("admin")).andReturn(baseUser);        replay(userDao);        User user = userService.load("admin");        assertUserEquals(user, baseUser);        verify(userDao);    }        //测试删除操作是否成功        @Test        public void testDelete(){            //没有返回值            userDao.deleteUser("admin");            //没有返回值            expectLastCall();            replay(userDao);            //执行业务操作            userService.delete("admin");                        verify(userDao);                    }                //测试添加一个用户,用户在数据库中不存在        /***         * mock验证是整个业务的操作流程是否正确         * 验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程         * */        @Test        public void testAddNotExits(){            //第一步验证从数据库中查询,该联系人不存在返回值是null            expect(userDao.load("admin")).andReturn(null);            //第二步添加联系人            userDao.addUser(baseUser);            expectLastCall();            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            try {                userService.add(baseUser);            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            verify(userDao);                                }                /***         * 验证添加操作的时候用户已经存在         * @throws Exception          * */        @Test(expected = Exception.class)        public void testAddExits() throws Exception{            //第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常            expect(userDao.load("admin")).andReturn(baseUser);            //第二步添加联系人            userDao.addUser(baseUser);            expectLastCall();            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            userService.add(baseUser);            verify(userDao);                            }                /*模拟登陆成功*/        @Test        public void testLoginOk() throws Exception{            //第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常            expect(userDao.load("admin")).andReturn(baseUser);            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            userService.login("admin", "123");            verify(userDao);                            }                /*模拟登陆失败,用户不存在*/        @Test(expected = Exception.class)        public void testLoginErrorUserNotExits() throws Exception{            //第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常            expect(userDao.load("admin")).andReturn(null);            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            userService.login("admin", "123");            verify(userDao);                            }                /*模拟登陆失败,密码错误*/        @Test(expected = Exception.class)        public void testLoginErrorPasswordError() throws Exception{            //第一步验证从数据库中查询,该联系人存在,返回联系人存在的异常            expect(userDao.load("admin")).andReturn(baseUser);            //记录上述状态            replay(userDao);            //验证userService.add的操作流程是否是按照上面的第一步和第二步来执行的。验证是业务的流程            //mock对象的密码返回值是baseUser的123,这里我们使用的是1234,所以这里就模拟了密码错误,会抛出异常            userService.login("admin", "1234");            verify(userDao);                            }}

代码下载地址

链接:https://pan.baidu.com/s/1osMlhTgoT0KbuMe5XKmwXw 密码:a7f4

 

转载于:https://www.cnblogs.com/kebibuluan/p/8914874.html

你可能感兴趣的文章
win10 localhost 解析为::1 的解决办法
查看>>
自己动手写一个通用的分页存储过程(适用于多表查询)
查看>>
一次练手实战破解某字典–爆破篇
查看>>
获取当前时间 YYYY-MM-DD
查看>>
从分布式一致性到共识机制(二)Raft算法
查看>>
大话设计模式:原型模式
查看>>
利用jenkins+saltstack+sh部署项目到多台服务器
查看>>
Android项目实战(十二):解决OOM的一种偷懒又有效的办法
查看>>
五大理由分析Springboot 2.0为什么选择HikariCP
查看>>
最佳实战Docker持续集成图文详解
查看>>
Linux下批量ping某个网段ip的脚本
查看>>
Grid++Report报表工具C/S实战篇(五)
查看>>
js scrollIntoViewIfNeeded
查看>>
提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)
查看>>
jenkins插件安装失败更改插件源
查看>>
手把手教你搭建一个基于Java的分布式爬虫系统
查看>>
基于SpringMVC+Spring+MyBatis实现秒杀系统【概况】
查看>>
BZOJ1432: [ZJOI2009]Function(找规律)
查看>>
C++源码里没有./configure文件的问题
查看>>
[E2E] Visual Differing Tests with Puppeteer and PixelMatch
查看>>