2013-04-25 2 views
1

У меня есть три метода, которые вызывают на издеваемом объекте. Важно, чтобы один из методов был применен до двух других, но меня не касается, в каком порядке задействованы последние два.Как выразить заказ «A, then (B или C)» в Mockito?

Может ли эта логика быть выражена с помощью Mockito? Насколько я могу судить, InOrder класс заставит меня заказать все три заклинания, как показано ниже:

InOrder inOrder = inOrder(mock); 
inOrder.verify(mock).crucialMethod(); 
inOrder.verify(mock).methodX(); 
inOrder.verify(mock).methodY(); // <-- I wouldn't care if this was invoked 
           //  before methodX() 

Я хотел бы, чтобы решить эту проблему, так что мои тесты менее тесно связаны с точным Поручения включаются последние два метода.

Возможно, что this question является дубликатом, но я изо всех сил старался понять, что ищет ОП, и не отвечает ли ответ на меня.

ответ

4

Вы можете использовать два объекта заказовМои:

import static org.mockito.Mockito.*; 

import org.junit.Test; 
import org.mockito.InOrder; 
import org.mockito.exceptions.verification.VerificationInOrderFailure; 

public class MyTest { 

    public interface ToBeTested{ 
     public void crucialMethod(); 
     public void methodX(); 
     public void methodY(); 
    } 

    @Test 
    public void testXThenY(){ 
     // Given 
     ToBeTested toBeTested = mock(ToBeTested.class); 

     // When 
     toBeTested.crucialMethod(); 
     toBeTested.methodX(); 
     toBeTested.methodY(); 

     // Then 

     InOrder inOrderX = inOrder(toBeTested); 
     inOrderX.verify(toBeTested).crucialMethod(); 
     inOrderX.verify(toBeTested).methodX(); 

     InOrder inOrderY = inOrder(toBeTested); 
     inOrderY.verify(toBeTested).crucialMethod(); 
     inOrderY.verify(toBeTested).methodY(); 
    } 

    @Test(expected=VerificationInOrderFailure.class) 
    public void crucialTooLateForX(){ 
     // Given 
     ToBeTested toBeTested = mock(ToBeTested.class); 

     // When 

     toBeTested.methodX(); 
     toBeTested.crucialMethod(); 
     toBeTested.methodY(); 

     // Then 

     InOrder inOrderX = inOrder(toBeTested); 
     inOrderX.verify(toBeTested).crucialMethod(); 
     inOrderX.verify(toBeTested).methodX(); 

     InOrder inOrderY = inOrder(toBeTested); 
     inOrderY.verify(toBeTested).crucialMethod(); 
     inOrderY.verify(toBeTested).methodY(); 
    } 

    @Test(expected=VerificationInOrderFailure.class) 
    public void crucialTooLateForY(){ 
     // Given 
     ToBeTested toBeTested = mock(ToBeTested.class); 

     // When 

     toBeTested.methodY(); 
     toBeTested.crucialMethod(); 
     toBeTested.methodX(); 

     // Then 

     InOrder inOrderX = inOrder(toBeTested); 
     inOrderX.verify(toBeTested).crucialMethod(); 
     inOrderX.verify(toBeTested).methodX(); 

     InOrder inOrderY = inOrder(toBeTested); 
     inOrderY.verify(toBeTested).crucialMethod(); 
     inOrderY.verify(toBeTested).methodY(); 
    } 
} 
+0

Отличный ответ, спасибо. Я не понимал, что классы «InOrder» работали таким образом. –

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