zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java 泛型 泛型的约束与局限性
    Java 泛型 泛型方法
    Java 泛型 泛型数组
    Java 泛型 协变性、逆变性
    Java 泛型 协变式覆盖和泛型重载
    Java 泛型 泛型代码和虚拟机
    Insertion Sort List
    Remove Duplicates from Sorted List II
    String to Integer (atoi)
    SpringMvc源码入门
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/8914874.html
Copyright © 2011-2022 走看看