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
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
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
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
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
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
最近更新: 2025/01/22, 13:46:16