2013-05-29 74 views
16

我正在使用Mockito framework在我的JUnit測試中創建Mock對象。每個模擬知道什麼方法被調用就可以了,所以在我的測試,我可以寫做模擬對象得到重置爲每個測試?

verify(myMock, atLeastOnce()).myMethod(); 

我想知道的是什麼已經叫這個內部模擬知識會在我的測試中仍然存在?如果它仍然存在,那麼在兩次測試中使用相同的verify方法時,我可能會得到誤報。

A碼示例

@RunWith(MockitoJUnitRunner.class) 
public class EmrActivitiesImplTest { 

    @Mock private MyClass myMock; 

    @Before 
    public void setup() { 
     when(myMock.myMethod()).thenReturn("hello"); 
    } 

    @Test 
    public void test1() { 
     // ..some logic 
     verify(myMock, atLeastOnce()).myMethod(); 
    } 

    @Test 
    public void test2() { 
     // ..some other logic 
     verify(myMock, atLeastOnce()).myMethod(); 
    } 
} 

模擬狀態被持續 - 無論TEST2會通,因爲TEST1的驗證方法傳遞

模擬狀態被複位 - 如果myMock.myMethod()不是TEST2將失敗稱爲

+0

如果我沒有錯,在所有測試之前設置被調用一次...所以是的,所有的測試都使用相同的模擬對象。您需要在每種測試方法開始時創建該對象 –

回答

20

JUnit每次運行新的測試方法時都會創建一個新的測試類實例,並在每次創建新的測試類時運行@Before方法。您可以輕鬆地測試它

@Before 
public void setup() { 
     System.out.println("setup"); 
     when(myMock.myMethod()).thenReturn("hello"); 
} 

而且MockitoJUnitRunner會爲每個測試方法

+8

這是正確的。 ** JUnit **設計者希望在測試方法之間進行測試隔離,因此它創建了一個新的測試類實例來運行每種測試方法。請注意,** TestNG **創建者採取了不同的方式,併爲每個測試類選擇了隔離,這意味着TestNG測試的測試方法之間沒有隔離。因此,實例模擬可能需要在每種測試方法之間重新設置。 – Brice

+0

當使用單例時,這是一個很大的問題,因爲模擬只適用於第一次測試... –

+0

你有沒有發現有記錄的地方?我已經知道這是真實的一段時間,但有人問我後,我一直在搜索,似乎無法在任何地方的文檔中找到它。 – dsingleton

0

如果您只是在setup中初始化模擬對象,那麼在每次測試中您都可以提供不同的功能。您可以初始化一次,然後改變它們在每次測試中的行爲/期望值。

12
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import static org.mockito.Mockito.*; 

@RunWith(MockitoJUnitRunner.class) 
public class sandbox { 

    @Mock 
    private MyClass myMock; 

    @Before 
    public void setup() { 
     when(myMock.myMethod()).thenReturn("hello"); 
    } 

    @Test 
    public void test1() { 
     myMock.myMethod(); 
     verify(myMock, times(1)).myMethod(); 
    } 

    @Test 
    public void test2() { 
     myMock.myMethod(); 
     verify(myMock, times(1)).myMethod(); 
    } 

} 

這通過創建一個新的MyMock模擬實例。如果國家堅持下去,那麼第二次測試就會失敗。如果你調試它,你會認爲你得到了每個測試的模擬對象的新實例。

+0

是的,同意,如果使用@RunWith(MockitoJUnitRunner.class),將會注入新的mock。 – yuranos87