Java Unit Test - Mocktio
Mockito是专门用于有效编写某种测试的框架,是Java的最佳模拟框架,经常与JUnit一起使用,用来模拟构造需要测试的对象,解决对象间的依赖关系。
在下面的情形,可能需要使用模拟对象来代替真实对象:
真实对象的行为是不确定的(例如,当前的时间或当前的温度);
真实对象很难搭建起来;
真实对象的行为很难触发(例如,网络错误);
真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
真实的对象是用户界面,或包括用户界面在内;
真实的对象使用了回调机制;
真实对象可能还不存在;
真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法。
单元测试三部曲
--> 链接?
1 环境信息
JDK : 8
Junit : 4.12
Mocktio : 2.28.2
2 使用方法
模拟被测试对象 --> 对非关键方法进行打桩 --> 验证被测对象行为或结果是否符合预期
示例:
//模拟被测试对象
List mockList = mock(List.class);
//打桩:当要获取mockList长度时,返回20
when(mockList.size()).thenReturn(20)
//验证:有两次行为,结果是一个int
verify(mockList, times(2)).get(anyInt())
3 原理
3.1 生成模拟对象的原理
根据被测对象类型生成一个继承这个类型的类 --> 实例化生成的类- -> 得到mock对象
3.2 打桩的原理
- 1 打桩完毕会生成一个Answer对象,存放到一个链表里。后面调用对应的方法的时候,就会从这个链表内找到对应的Answer对象,从中获取对应的值返回。
- 2 对2.1中生成的派生类设置hook回调方法,方法的返回值及打桩时给的值,所有的方法调用最终都会交由
MockHandlerImpl.handle
。 - 3 Mockito会假定每个方法调用需要被打桩,生成一个和这个方法调用相对应的OngoingStubbing对象,将这个对象暂时存起来。
当when方法执行的时候,就会取出这个暂存的OngoingStubbing对象返回,这样我们就能在这上面打桩(调用thenReturn等方法),返回我们需要的值了。
when(verifyService.validate(any())).thenReturn(true);
doNothing().when(calculateService).print(isA(Integer.class), isA(Integer.class));
3.2 验证行为结果的原理
分阶段分步骤的执行:
- 1 Mockito会记录下要验证的对象,以及要验证的参数。
- 2 在执行方法调用的时候,取出要验证的对象、验证的参数并执行验证。
verify(mock).someMethod();
verify(mock, times(10)).someMethod();
verify(mock, atLeastOnce()).someMethod();
4 项目搭建
- 1 maven添加依赖:
<dependency>