2013-04-25 21 views
1

我有一個被嘲笑的對象上調用的三種方法。這一點很重要的方法之一是在另外兩個之前被調用,但我不關心什麼順序的最後兩個被調用英寸如何在Mockito中表示「A,然後(B或C)」調用訂單?

可以這樣的邏輯與表達的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是重複的,但我已經努力去理解到底是什麼OP正在尋求,也沒有回答是否適用於我。

回答

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'類以這種方式工作。 – 2013-04-25 09:05:09

相關問題