Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a2b22ac

Browse files
使用PowerMockRunner和Mockito编写单元测试用例详解
Signed-off-by: fengbaichao <fengbaichaoZK@163.com>
1 parent 5dab642 commit a2b22ac

File tree

1 file changed

+177
-0
lines changed

1 file changed

+177
-0
lines changed

‎docs/basis/PowerMockRunnerAndMockito.md

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
单元测试可以提高测试开发的效率,减少代码错误率,提高代码健壮性,提高代码质量。在Spring框架中常用的两种测试框架:PowerMockRunner和SpringRunner两个单元测试,鉴于SpringRunner启动的一系列依赖和数据连接的问题,推荐使用PowerMockRunner,这样能有效的提高测试的效率,并且其提供的API能覆盖的场景广泛,使用方便,可谓是Java单元测试之模拟利器。
2+
3+
#### 1. PowerMock是什么?
4+
5+
PowerMock是一个Java模拟框架,可用于解决通常认为很难甚至无法测试的测试问题。使用PowerMock,可以模拟静态方法,删除静态初始化程序,允许模拟而不依赖于注入,等等。PowerMock通过在执行测试时在运行时修改字节码来完成这些技巧。PowerMock还包含一些实用程序,可让您更轻松地访问对象的内部状态。
6+
7+
8+
举个例子,你在使用Junit进行单元测试时,并不想让测试数据进入数据库,怎么办?这个时候就可以使用PowerMock,拦截数据库操作,并模拟返回参数。
9+
10+
#### 2. PowerMock包引入
11+
12+
```xml
13+
<!-- 单元测试 依赖-->
14+
<dependency>
15+
<groupId>org.powermock</groupId>
16+
<artifactId>powermock-core</artifactId>
17+
<version>2.0.2</version>
18+
<scope>test</scope>
19+
</dependency>
20+
<dependency>
21+
<groupId>org.mockito</groupId>
22+
<artifactId>mockito-core</artifactId>
23+
<version>2.23.0</version>
24+
</dependency>
25+
<dependency>
26+
<groupId>org.powermock</groupId>
27+
<artifactId>powermock-module-junit4</artifactId>
28+
<version>2.0.4</version>
29+
<scope>test</scope>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.powermock</groupId>
33+
<artifactId>powermock-api-mockito2</artifactId>
34+
<version>2.0.2</version>
35+
<scope>test</scope>
36+
</dependency>
37+
<dependency>
38+
<groupId>com.github.jsonzou</groupId>
39+
<artifactId>jmockdata</artifactId>
40+
<version>4.3.0</version>
41+
</dependency>
42+
<!-- 单元测试 依赖-->
43+
```
44+
45+
#### 3. 重要注解说明
46+
47+
```java
48+
@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
49+
@PrepareForTest({RandomUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
50+
@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
51+
```
52+
53+
54+
55+
#### 4. 使用示例
56+
57+
##### 4.1 模拟接口返回
58+
59+
首先对接口进行mock,然后录制相关行为
60+
61+
```java
62+
InterfaceToMock mock = Powermockito.mock(InterfaceToMock.class)
63+
64+
Powermockito.when(mock.method(Params...)).thenReturn(value)
65+
66+
Powermockito.when(mock.method(Params..)).thenThrow(Exception)
67+
```
68+
69+
##### 4.2 设置对象的private属性
70+
71+
需要使用whitebox向class或者对象中赋值。
72+
73+
如我们已经对接口尽心了mock,现在需要将此mock加入到对象中,可以采用如下方法:
74+
75+
```java
76+
Whitebox.setInternalState(Object object, String fieldname, Object... value);
77+
```
78+
79+
其中object为需要设置属性的静态类或对象。
80+
81+
##### 4.3 模拟构造函数
82+
83+
对于模拟构造函数,也即当出现new InstanceClass()时可以将此构造函数拦截并替换结果为我们需要的mock对象。
84+
85+
注意:使用时需要加入标记:
86+
87+
```java
88+
@RunWith(PowerMockRunner.class)
89+
90+
@PrepareForTest({ InstanceClass.class })
91+
92+
@PowerMockIgnore("javax.management.\*")
93+
94+
Powermockito.whenNew(InstanceClass.class).thenReturn(Object value)
95+
```
96+
97+
##### 4.4 模拟静态方法
98+
99+
模拟静态方法类似于模拟构造函数,也需要加入注释标记。
100+
101+
```java
102+
@RunWith(PowerMockRunner.class)
103+
104+
@PrepareForTest({ StaticClassToMock.class })
105+
106+
@PowerMockIgnore("javax.management.\*")
107+
108+
Powermockito.mockStatic(StaticClassToMock.class);
109+
110+
Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
111+
```
112+
113+
##### 4.5 模拟final方法
114+
115+
Final方法的模拟类似于模拟静态方法。
116+
117+
```java
118+
@RunWith(PowerMockRunner.class)
119+
120+
@PrepareForTest({ FinalClassToMock.class })
121+
122+
@PowerMockIgnore("javax.management.\*")
123+
124+
Powermockito.mockStatic(FinalClassToMock.class);
125+
126+
Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
127+
```
128+
129+
##### 4.6 模拟静态类
130+
131+
模拟静态类类似于模拟静态方法。
132+
133+
##### 4.7 使用spy方法避免执行被测类中的成员函数
134+
135+
如被测试类为:TargetClass,想要屏蔽的方法为targetMethod.
136+
137+
```java
138+
1) PowerMockito.spy(TargetClass.class);
139+
140+
2) Powemockito.when(TargetClass.targetMethod()).doReturn()
141+
142+
3) 注意加入
143+
144+
@RunWith(PowerMockRunner.class)
145+
146+
@PrepareForTest(DisplayMoRelationBuilder.class)
147+
148+
@PowerMockIgnore("javax.management.*")
149+
```
150+
151+
##### 4.8 参数匹配器
152+
153+
有时我们在处理doMethod(Param param)时,不想进行精确匹配,这时可以使用Mockito提供的模糊匹配方式。
154+
155+
如:Mockito.anyInt(),Mockito.anyString()
156+
157+
##### 4.9 处理public void型的静态方法
158+
159+
```java
160+
Powermockito.doNothing.when(T class2mock, String method, <T>... params>
161+
```
162+
163+
#### 5. 单元测试用例可选清单
164+
165+
输入数据验证:这些检查通常可以对输入到应用程序系统中的数据采用。
166+
167+
- 必传项测试
168+
- 唯一字段值测试
169+
- 空值测试
170+
- 字段只接受允许的字符
171+
- 负值测试
172+
- 字段限于字段长度规范
173+
- 不可能的值
174+
- 垃圾值测试
175+
- 检查字段之间的依赖性
176+
- 等效类划分和边界条件测试
177+
- 错误和异常处理测试

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /