2016-04-13 176 views
2

如何驗證一個呼叫是在多個其他呼叫之後(或之前)發生的,而未指定其他呼叫的訂單?Mockito在一組其他呼叫之前/之後驗證呼叫

例如爲:

objA.method1(); 
objB.method2(); 
objC.method3(); 
transaction.commmit(); 

我可能要檢查commit是所有其他交互後調用。但我不想限制他們的具體順序。

+0

嗨@Vituel,你有沒有試過的答案providedr?希望它有幫助 – troig

回答

0

也許有更好的選擇(我會等待其他答案),但一個選擇是定義三個不同的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(); 
}  

希望它可以幫助

0

也許不是你正在尋找的答案,但有時很難測試代碼意味着是時候重構。提取三個順序無關的方法調用序列作爲一個單一的方法myClass.abcMethods(),然後在你的SUT使用間諜根本的InOrder驗證myClass.abcMethods()然後transaction.commit()