如何驗證一個呼叫是在多個其他呼叫之後(或之前)發生的,而未指定其他呼叫的訂單?Mockito在一組其他呼叫之前/之後驗證呼叫
例如爲:
objA.method1();
objB.method2();
objC.method3();
transaction.commmit();
我可能要檢查commit
是所有其他交互後調用。但我不想限制他們的具體順序。
如何驗證一個呼叫是在多個其他呼叫之後(或之前)發生的,而未指定其他呼叫的訂單?Mockito在一組其他呼叫之前/之後驗證呼叫
例如爲:
objA.method1();
objB.method2();
objC.method3();
transaction.commmit();
我可能要檢查commit
是所有其他交互後調用。但我不想限制他們的具體順序。
也許有更好的選擇(我會等待其他答案),但一個選擇是定義三個不同的InOrder
,每個方法調用一個(objA,objB,objC)和事務,然後獨立驗證所有InOrder 。
像這樣(只是一個例子):
class ObjA {
void method1() {}
}
class ObjB {
void method2() {}
}
class ObjC {
void method3() {}
}
class Transacction {
void commit() {};
}
class ClassToTest {
private ObjA objA;
private ObjB objB;
private ObjC objC;
Transacction transaction;
ClassToTest(ObjA objA, ObjB objB, ObjC objC, Transacction transaction) {
this.objA = objA;
this.objB = objB;
this.objC = objC;
this.transaction = transaction;
}
void method() {
objA.method1();
objC.method3();
objB.method2();
transaction.commit();
}
}
測試方法:
@Test
public void testMethod() throws Exception {
ObjA objA = mock(ObjA.class);
ObjB objB = mock(ObjB.class);
ObjC objC = mock(ObjC.class);
Transacction transaction = mock(Transacction.class);
// Create a InOrder per each call and transaction
InOrder inOrderObjA = inOrder(objA, transaction);
InOrder inOrderObjB = inOrder(objB, transaction);
InOrder inOrderObjC = inOrder(objC, transaction);
ClassToTest classToTest = new ClassToTest(objA, objB, objC, transaction);
classToTest.method();
// Verify transaction.commit() is executed after objA.method1()
inOrderObjA.verify(objA).method1();
inOrderObjA.verify(transaction).commit();
// Verify transaction.commit() is executed after objB.method2()
inOrderObjB.verify(objB).method2();
inOrderObjB.verify(transaction).commit();
// Verify transaction.commit() is executed after objC.method3()
inOrderObjC.verify(objC).method3();
inOrderObjC.verify(transaction).commit();
}
希望它可以幫助
也許不是你正在尋找的答案,但有時很難測試代碼意味着是時候重構。提取三個順序無關的方法調用序列作爲一個單一的方法myClass.abcMethods()
,然後在你的SUT使用間諜根本的InOrder
驗證myClass.abcMethods()
然後transaction.commit()
嗨@Vituel,你有沒有試過的答案providedr?希望它有幫助 – troig