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

 

posted on   luzhouxiaoshuai  阅读(268)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示