小飞知识库 | YeLu🤠MiLu🤪 小飞知识库 | YeLu🤠MiLu🤪
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YeLu

爱技术的YeLu🤠
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 函数式编程

  • spring

  • springMVC

  • springCloud

  • jvm

  • JUC并发编程

  • mybatis

  • 设计模式

  • 📒springBoot

  • 单元测试

    • 单元测试问题
    • Junit的使用
    • dbunit的使用
    • spring的测试
    • spring整合dbunit
    • easymock的使用
      • 导包
      • 编写DAO类
      • 编写Service
      • 测试类
      • 多个DAO的测试
  • java
  • 单元测试
YeLu🤠
2025-01-16
目录

easymock的使用

参考demo:G:\学习资料\java\java学习文档\java技术文档\Spring文档\xufei-spring-word\xufei-projo-test =》 easymock

EasyMock是专门用来做业务逻辑层或者控制器测试的这样一个框架

注意一个问题:

小项目 一般做DAO层测试

稍稍大一点的项目 一般情况下 DAO层 和Service层都要做测试

场景:项目现在做分层开发 张三做的 Service层 李四做的是 DAO层 现在的问题是 张三写完约束规范的 之后 请假回家了 李四 不经意间就 开发完成了Service层 李四需要做测试 需要知道自己编写的方法到底有没有问题 ? 那么怎么办呢?

第一种可以使用stub这种思想

第二种 使用EasyMock来动态生成DAO的实现类 来机械能给你业务逻辑层的测试

Notice:业务逻辑层的测试和DAO层的测试 着重点是不一样的

Service层测试的做重点:DAO的 调用次数 以及调用的顺序--------这个是业务逻辑层测试的着重点

DAO层测试的着重点:那一定是数据的准确性

# 导包

        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.5.1</version>
            <scope>test</scope>
        </dependency>
1
2
3
4
5
6

# 编写DAO类

public interface IEMUserDAO {

    /**
     * 通过id找用户
     *
     * @param id
     * @return
     */
    User findUserById(int id);


    /**
     * 插入数据
     */
    void add(User user);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 编写Service

@Service(value = "easyMockUserService")
public class UserService {

    private IEMUserDAO userDAO;

    public void setUserDAO(IEMUserDAO userDAO) {
        this.userDAO = userDAO;
    }

    /**
     * 一会儿咋们要测试这个方法
     *
     * @param id
     * @return
     */
    public User findUserById(int id) {
        userDAO.findUserById(id);
        return userDAO.findUserById(id);
    }

    /**
     * 如何测试这种方法?
     *
     * @param user
     */
    public void insert(User user) {
        userDAO.add(user);
        userDAO.add(user);
    }

    /**
     * 这里调用了多个方法
     *
     * @param user
     * @param id
     */
    public void aa(User user, int id) {
        userDAO.findUserById(id);
        userDAO.add(user);
    }

}
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
32
33
34
35
36
37
38
39
40
41
42

# 测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:bean-base.xml"})
public class TestUserService {

    @Resource(name = "easyMockUserService")
    private UserService userService;

    private User exUser;


    @Before
    public void init() {
        exUser = new User(1, "xff", "123");
    }

    /**
     * 使用EasyMock测试业务逻辑层
     */
    @Test
    public void testFindUserById() {
        // 使用EasyMock有一个步骤
        // 第一步:生成DAO的接口
        // 下面这个生成的是DAO的实现类
        // 下面接下来的两句代码实际上在做记录
        // 使用的是动态代理 生成的这个接口的实现类
        IEMUserDAO userDAO = EasyMock.createMock(IEMUserDAO.class);
        // 给这个生成的代理类对象设置 期望值
        // 在Service中调用了一次
        EasyMock.expect(userDAO.findUserById(1)).andReturn(exUser);
        // 在Service中 又调用了一次
        EasyMock.expect(userDAO.findUserById(1)).andReturn(exUser);
        // 让上面的设置生效   replay:放映
        EasyMock.replay(userDAO);
        // 接下来进行对象的设置
        userService.setUserDAO(userDAO);
        // 接下来就开始调用业务逻辑
        userService.findUserById(1);
        // 接下来就进行 校验了
        EasyMock.verify(userDAO);
    }

    /**
     * 使用EasyMock测试业务逻辑层
     */
    @Test
    public void testAdd() {
        // 使用EasyMock有一个步骤
        // 第一步:生成DAO的接口
        // 下面这个生成的是DAO的实现类
        // 下面接下来的两句代码实际上在做记录
        // 使用的是动态代理 生成的这个接口的实现类
        IEMUserDAO userDAO = EasyMock.createMock(IEMUserDAO.class);
        // 给这个生成的代理类对象设置 期望值
        userDAO.add(exUser);
        EasyMock.expectLastCall();
        // 让上面的设置生效   replay:放映
        EasyMock.replay(userDAO);
        // 接下来进行对象的设置
        userService.setUserDAO(userDAO);
        // 接下来就开始调用业务逻辑
        userService.insert(exUser);
        // 接下来就进行 校验了
        EasyMock.verify(userDAO);
    }

    /**
     * 测试多方法的调用
     */
    @Test
    public void testAa() {
        // 使用EasyMock有一个步骤
        // 第一步:生成DAO的接口
        // 下面这个生成的是DAO的实现类
        // 下面接下来的两句代码实际上在做记录
        // 使用的是动态代理 生成的这个接口的实现类
        // 如果我们对调用的顺序有关系的 话那么只能创建一个严格意义上的Mock
        IEMUserDAO userDAO = EasyMock.createStrictMock(IEMUserDAO.class);
        // 给这个生成的代理类对象设置 期望值
        EasyMock.expect(userDAO.findUserById(1)).andReturn(exUser);

        userDAO.add(exUser);
        EasyMock.expectLastCall();

        // 让上面的设置生效  replay:放映
        EasyMock.replay(userDAO);
        // 接下来进行对象的设置
        userService.setUserDAO(userDAO);
        // 接下来就开始调用业务逻辑
        userService.aa(exUser, 1);
        // 接下来就进行 校验了
        EasyMock.verify(userDAO);
    }
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

# 多个DAO的测试

public class TestDeptStaffService {

    private DeptStaffService deptStaffService;

    /**
     * 初始化操作的
     */
    @Before
    public void init() {
        deptStaffService = new DeptStaffService();
    }


    @Test
    public void testMm() {

        // 注意:下面创建的严格意义上的Mock只是针对deptDAO自己  以及staffDAO自己
        // 这两个对象之间没有任何关系
        IDeptDAO deptDAO = EasyMock.createStrictMock(IDeptDAO.class);
        IStaffDAO staffDAO = EasyMock.createStrictMock(IStaffDAO.class);


        staffDAO.cc();
        EasyMock.expectLastCall();

        // 进行记录
        deptDAO.aa();
        EasyMock.expectLastCall();


        // 进行记录
        EasyMock.replay(deptDAO, staffDAO);

        // 下面进行设置
        deptStaffService.setDeptDAO(deptDAO);
        deptStaffService.setStaffDAO(staffDAO);

        // 接下来进行测试
        deptStaffService.mm();
        // 接下来进行校验
        EasyMock.verify(deptDAO, staffDAO);
    }

    /**
     * 测试的是业务调用顺序是否符合预期
     */
    @Test
    public void testMm1() {

        // 注意:下面创建的严格意义上的Mock只是针对deptDAO自己  以及staffDAO自己
        // 这两个对象之间没有任何关系

        // 下面这个类相当于可以统一管理所有申明的DAO
        IMocksControl strictControl = EasyMock.createStrictControl();

        IDeptDAO deptDAO = strictControl.createMock(IDeptDAO.class);
        IStaffDAO staffDAO = strictControl.createMock(IStaffDAO.class);


        // 进行记录
        // 期望先调用 aa 再调用cc
        deptDAO.aa();
        EasyMock.expectLastCall();

        staffDAO.cc();
        EasyMock.expectLastCall();

        // 进行记录
        strictControl.replay();

        // 下面进行设置
        deptStaffService.setDeptDAO(deptDAO);
        deptStaffService.setStaffDAO(staffDAO);

        // 接下来进行测试
        // 实际上 先调用了cc 再调用了aa 测试不通过
        deptStaffService.mm();
        // 接下来进行校验
        strictControl.verify();
    }

    @Test
    public void testNn() {

        // 注意:下面创建的严格意义上的Mock只是针对deptDAO自己  以及staffDAO自己
        // 这两个对象之间没有任何关系

        // 下面这个类相当于可以统一管理所有申明的DAO
        // IMocksControl strictControl = EasyMock.createStrictControl();

        IDeptDAO deptDAO = EasyMock.createStrictMock(IDeptDAO.class);
        IStaffDAO staffDAO = EasyMock.createStrictMock(IStaffDAO.class);


        deptDAO.bb();
        EasyMock.expectLastCall();

        // 进行记录
        deptDAO.aa();
        EasyMock.expectLastCall();


        staffDAO.cc();
        EasyMock.expectLastCall();

        staffDAO.dd();
        EasyMock.expectLastCall();

        // 进行记录
        EasyMock.replay(deptDAO, staffDAO);

        // 下面进行设置
        deptStaffService.setDeptDAO(deptDAO);
        deptStaffService.setStaffDAO(staffDAO);

        // 接下来进行测试
        deptStaffService.nn();
        // 接下来进行校验
        EasyMock.verify(deptDAO, staffDAO);
    }


}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#easymock#单元测试
最近更新: 2025/01/22, 13:46:16
spring整合dbunit

← spring整合dbunit

最近更新
01
服务端配置
07-30
02
frp 安装
07-30
03
Prometheus采集Springboot应用
02-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | YeLu🤠MiLu🤪 | MIT License 蜀ICP备2024116879号 | 川公网安备51012202001998号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
欢迎你,我的朋友
看板娘