• 07.Easymock的实际应用


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

  • 相关阅读:
    极光推送 标签和别名设置说明
    极光推送集成遇到的坑
    iOS开发:创建推送开发证书和生产证书,以及往极光推送官网上传证书的步骤方法
    【大数据算法】蓄水池抽样算法
    【leetcode】Find Minimum in Rotated Sorted Array I&&II
    朴素贝叶斯算法的实例
    【leetcode】Min Stack -- python版
    朴素贝叶斯算法的python实现
    决策树的python实现
    kNN算法python实现和简单数字识别
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8914874.html
Copyright © 2020-2023  润新知