2016-04-13 2 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(), а затем с помощью Spy на вашем SUT просто сделать InOrder проверить из myClass.abcMethods(), а затем transaction.commit()

Смежные вопросы