第一步下载对应的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