對于NonStrictExpectation,可以進行verification。對于StrictExpectation則沒有必要。在new Verifications(){}中的方法至少被調(diào)用一次。
驗證某個方法沒被調(diào)用
times = 0
驗證順序調(diào)用
普通的new Verifications(){}沒有驗證其中方法的調(diào)用順序。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階段調(diào)用的所有方法在verify代碼塊中都有相應的匹配,順序可以不一致。
full verification in order
使用new FullVerificationsInOrder()
限制full verification的目標類型
默認使用full verification時,所有mock類的所有調(diào)用都必須顯式驗證。如果需要限定驗證的類或者實例,使用FullVerifications(xxx.class)或者FullVerifications(mockObject)。
驗證沒有調(diào)用發(fā)生
使用空的FullVerifications(xxx.class)或者FullVerifications(mockObject)可以驗證在指定類/實例上沒有調(diào)用方法。但是如果Expectation中有minTimes和times的方法會被正常驗證。