mock是模拟对象,用于模拟真实对象的行为
powermock拓展了esaymock和mockito框架,增加了对static 和final方法mock支持等功能,
本文阐述powermockto简单用法,未包含 spy,captor等
jar包
1 | <dependency> |
mock流程
- 创建一个mock对象
- 期望:记录希望mock对象有的行为,通常是伪造的部分
- 回放(replay):调用我们的测试的代码
- 验证(Verfications):验证结果
注解概述
@RunWith(PowerMockRunner.class)
1
2
3
4
5
public void initMocks() {
//注解初始化
MockitoAnnotations.initMocks(this);
}
@PrepareForTest({Student.class})
如果mock的对象的方法是静态、final、私有方法,将类加到注解数组中
@Mock
mock的对象,mock创建一个空白实例,没有属性没有方法
@InjectMocks
mock对象自动注入到该测试类中,尝试类型注入,如果有多个类型的mock对象,那么会根据名称进行注入,当注入失败的时候,不会抛出异常
mock
普通方法
1 | public class T1 { |
模拟静态方法
1 | public class T1 { |
模拟final类或方法
1 | public class T1 { |
构造函数
1 | public class T1 { |
模拟私有方法
1 | public class T1 { |
doAnswer
对method内容进行mock,根据invocation接口进行书写,进而对callmethod进行测试
1 | PowerMockito.doAnswer(invocation -> { |
InvocationOnMock
1 | //获取mock的对象 |
verfications
验证方法调用
Mockito.verify(mock).create()验证调用了create方法。
Mockito.verify(mock, Mockito.never()).update();验证没有调用update方法。
验证调用次数
Mockito.times(int n) : 准确的验证方法调用的次数:n
Mockito.atLeastOnce() : 验证方法至少调用1次
Mockito.atLeast(int n) : 验证方法最少调用n次
Mockito.atMost(int n): 验证方法最多调用n次
Mockito.inOrder:验证方法调用的顺序
原理简述
- 当某个方法被注解@PrepareForTest注解后,启动该测试用例,会创建一个新的MockclassLoader实例,然后加载测试用例用到的类(系统类除外)
- 加载过程中,会根据mock请求修改mock的class文件,eg,去掉final标识,修改方法体
- 对于系统类,会修改调用系统类的class文件,不会直接修改系统类class