单元测试
常见mock框架
- jmock:通过mock对象来模拟一个对象的行为,从而隔离开我们不关心的其他对象,使得测试变得简单。缺点:在执行前记录期望行为,显得很繁琐。
- Mockito:Mockito通过在执行后校验哪些函数已经被调用,消除了对期望行为的需要,API非常简洁。缺点:对于静态函数、构造函数、私有函数等还是无能为力。
- powermock:PowerMock是在Mockito的基础上做出的扩展。通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 实现了对静态方法、构造方法、私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能。缺点:会对字节码篡改,即测试时的字节码与平时编译出来的字节码是不一样的,而很多统计单元测试覆盖率的插件是以字节码来统计的,所以PowerMock编写的测试程序不能被统计进覆盖率。
推荐Mockito和powermock
使用方式
参考我的文章
https://www.jianshu.com/writer#/notebooks/24041444/notes/32728232/preview
-
初始化
使用注解(@Mock、@InjectMocks等),必须实例化mock对象,有两种方式实例化mock对象:
@RunWith(MockitoJUnitRunner.class)
MockitoAnnotations.initMocks(this) -
常用api
when(mockObject.someMethod()).thenReturn(...)
用来定义当条件满足时函数的返回值。
when(mockObject.someMethod()).thenReturn(...).thenReturn(...)
用来定义多个返回值的情况。
doReturn(...).when(mockObject.someMethod())
when(mockObject.someMethod()).thenThrow(new Runtime
Exception())
执行某方法时抛出异常。
doThrow(new RuntimeException()).when(mockObject.someMethod())
对void方法进行预期设定
1.doNothing().when(mock.someMethod())
2.doThrow(new RuntimeException()).when(mock.someMethod())
3.doNothing().doThrow(new RuntimeException()).when(mock.someMethod())
Mockito会自动记录自己的交互行为,可以用verify(…).methodXxx(…)语法来验证Xxx()方法是否按照预期进行了调用
1.验证调用次数:verify(mockObject,times(n)).someMethod(argument);//n为被调用的次数
2.验证超时:verify(mockObject, timeout(100)).someMethod();
3.既验证调用次数,又验证是否超时:verify(mockObject, timeout(100).times(1)).someMethod();