一、背景
新写了一个私有方法,在写单元测试代码时,发现一个私有方法需要mock,Mockito无法实现,于是引入了PowerMockito
二、PowerMock
1.PowerMock简介
PowerMockito扩展了EasyMock和Mockito框架,实现了对静态方法,构造方法、私有方法以及final方法的模拟支持。
2.PowerMock和Mockito版本
PowerMockito引入时,要根据Mockito版本选择对应版本,否则运行单测时会出现各种奇怪报错。
3.推荐使用的版本
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
三、实战
0. Demo
public class Trade {
public double findAmountByType(double originalAmount, String type) {
double rate = this.getRateByType(type);
return originalAmount * rate;
}
private boolean getRateByType(String type) {
// xxx
}
}
1.mock当前类的私有方法
@RunWith(PowerMockRunner.class) // 代表该测试类使用PowerMock
@PrepareForTest({Trade.class}) // 告诉PowerMock哪些类需要字节码级别操作
@PowerMockIgnore({"javax.management.*"}) // 忽略一些字节码相关的类,防止ClassCastException
public class Test {
@Test
public void testFindAmountByType() {
Trade trade = PowerMockito.spy(new Trade()); // 通过PowerMock初始化要测试的类
PowerMockito.doReturn(10d).when(trade, "getRateByType", "USA"); // mock方法返回值,返回值设置在doReturn中,when方法的参数第一个是mock的对象,第二个是方法名字,后面的是方法参数
double res = trade.findAmountByType(10, "USA"); // 调用要测试的方法
System.out.println(res);
Assert.assertEqual(res, 100d); // 检查结果是否为期望值
}
}