对于NonStrictExpectation,可以进行verification。对于StrictExpectation则没有必要。在new Verifications(){}
中的方法至少被调用一次。
验证某个方法没被调用
times = 0
验证顺序调用
普通的new Verifications(){}
没有验证其中方法的调用顺序。new VerificationsInOrder(){}
用来验证(相对)顺序。
验证部分顺序
使用unverifiedInvocations()
方法固定不需要验证的方法的位置。
第一种场景是验证部分方法的顺序,其余方法不需要验证:
@Test
public void TestMethod(@Mocked final Dependency mock) {
mock.mockMethod1();
mock.mockMethod2();
mock.mockMethod3();
mock.mockMethod4();
new VerificationsInOrder(){
{
// 下面的代码会失败:
// Unexpected invocation of: Dependency#mockMethod2()
// 如果两个方法相连,则其在replay中也必须直接相连
// unverifiedInvocations();
// mock.mockMethod1();
// mock.mockMethod4();
// 成功
mock.mockMethod1();
unverifiedInvocations();
mock.mockMethod4();
}
};
}
第二种场景是关心部分方法顺序,另一些方法也需要验证,但是不关心顺序。这时需要两个Verification块:
@Test
public void TestMethod(@Mocked final Dependency mock) {
mock.mockMethod1();
mock.mockMethod2();
mock.mockMethod3();
mock.mockMethod4();
new VerificationsInOrder(){{
mock.mockMethod1();
unverifiedInvocations();
mock.mockMethod4();
}};
new Verifications(){{
mock.mockMethod3();
mock.mockMethod2();
}};
}
多个verification块时,其相对顺序会引起比较诡异的事:
@Test
public void TestMethod(@Mocked final Dependency mock) {
mock.mockMethod1();
mock.mockMethod2();
mock.mockMethod3();
mock.mockMethod4();
//下面的代码会失败
//MissingInvocation: Missing invocation of:Dependency#mockMethod2()
//颠倒一下两个verification的顺序则会通过
//原因似乎是Verifications会将验证过的方法删除
new Verifications(){{
mock.mockMethod3();
mock.mockMethod2();
}};
new VerificationsInOrder(){{
mock.mockMethod1();
mock.mockMethod2();
mock.mockMethod4();
}};
}
full verification
new FullVerifications() {...}
可以保证replay阶段调用的所有方法在verify代码块中都有相应的匹配,顺序可以不一致。
full verification in order
使用new FullVerificationsInOrder()
限制full verification的目标类型
默认使用full verification时,所有mock类的所有调用都必须显式验证。如果需要限定验证的类或者实例,使用FullVerifications(xxx.class)
或者FullVerifications(mockObject)
。
验证没有调用发生
使用空的FullVerifications(xxx.class)
或者FullVerifications(mockObject)
可以验证在指定类/实例上没有调用方法。但是如果Expectation中有minTimes和times的方法会被正常验证。
网友评论