八、 验证依赖方法
在单元测试中,验证是确认模拟的依赖方法是否按照预期被调用或未调用的过程。Mockito提供了许多方法来验证依赖方法调用,给我们编写单元测试用例带来了很大的帮助。
1. 根据参数验证方法调用
1) 验证无参数方法调用
2) 验证指定参数方法调用
3) 验证任意参数方法调用
4) 验证可空参数方法调用
5) 验证必空参数方法调用
6) 验证可变参数方法调用
对于一些变长度参数方法,可以按实际参数个数进行验证:
也可以用Mockito.any()进行通用验证:
2. 验证方法调用次数
1) 验证方法默认调用1次
2) 验证方法从不调用
3) 验证方法调用n次
4) 验证方法调用至少1次
5) 验证方法调用至少n次
6) 验证方法调用最多1次
7) 验证方法调用最多n次
8) 验证方法调用指定n次
Mockito允许按顺序进行验证方法调用,未被验证到的方法调用将不会被标记为已验证。
9) 验证对象及其方法调用1次
用于验证对象及其方法调用1次,如果该对象还有别的方法被调用或者该方法调用了多次,都将导致验证方法调用失败。
相当于:
3. 验证方法调用并捕获参数值
Mockito提供ArgumentCaptor类来捕获参数值,通过调用forClass(Class<T> clazz)方法来构建一个ArgumentCaptor对象,然后在验证方法调用时来捕获参数,最后获取到捕获的参数值并验证。如果一个方法有多个参数都要捕获并验证,那就需要创建多个ArgumentCaptor对象。
ArgumentCaptor的主要接口方法:
• capture方法,用于捕获方法参数;
• getValue方法,用于获取捕获的参数值,如果捕获了多个参数值,该方法只返回最后一个参数值;
• getAllValues方法,用户获取捕获的所有参数值。
1) 使用ArgumentCaptor.forClass方法定义参数捕获器
在测试用例方法中,直接使用ArgumentCaptor.forClass方法定义参数捕获器。
注意:
定义泛型类的参数捕获器时,存在强制类型转换,会引起编译器警告。
2) 使用@Captor注解定义参数捕获器
也可以用Mockito提供的@Captor注解,在测试用例类中定义参数捕获器。
注意:
定义泛型类的参数捕获器时,由于是Mockito自行初始化,不会引起编译器警告。
3) 捕获多次方法调用的参数值列表
4. 验证其它特殊方法
1) 验证final方法调用
final方法的验证跟普通方法类似,这里不再累述。
2) 验证私有方法调用
PowerMockito提供verifyPrivate方法验证私有方法调用。
3) 验证构造方法调用
PowerMockito提供verifyNew方法验证构造方法调用。
4) 验证静态方法调用
PowerMockito提供verifyStatic方法验证静态方法调用。