2013-02-26 82 views
7

我有一個測試類(基於TestNG),我使用Mockito.verify作爲間諜對象。重置Mockito間諜

這工作:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

但在這裏:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

我得到一個Mokito例外,我有someMethodNeedToBeChecked方法的一個以上的調用。當然,我試圖添加Mockito.reset(testObject),但它根本沒有幫助我。

如果我需要在幾次測試中驗證相同的方法,我該如何重置間諜對象?

+0

我問過類似的問題在http://programmers.stackexchange.com/questions/188299/is-this-an-適當使用-的-mockitos-復位方法。只是FYI,雖然這與模擬不是間諜有關。 – 2013-02-26 13:32:37

+0

你在哪裏嘗試將調用添加到'reset'?也許編輯你的代碼來顯示你的嘗試,但註釋掉? – 2013-02-26 13:34:26

+0

我附上了原型示例,重置了我在@BeforeMethod \ @BeforeClass中進行的重置,與@After一樣,甚至在驗證之前 - 它不起作用。據我所知,這只是間諜的一個問題,重置只是爲了模擬對象。 – 2013-02-26 14:25:41

回答

12

documentation的Mockito:

重置嘲笑(自1.8.0)

智能用戶的Mockito,因爲他們知道這可能是較差的測試標誌很難使用此功能。通常情況下,您不需要重置您的模擬,只需爲每種測試方法創建新的模擬。 而不是重置(),請考慮編寫簡單,小而集中的測試方法,而不是冗長的,過度指定的測試。在測試方法的中間,第一個潛在的代碼氣味被重置()。這可能意味着你測試的太多了。按照你的測試方法的耳語:「請保持我們小&關注單一行爲」。 mockito郵件列表上有幾個關於它的線程。

我們添加reset()方法的唯一原因是使得使用容器注入的模擬成爲可能。

你或許應該只是重新在@BeforeMethod間諜:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

我不明白你爲什麼說每個測試現在都需要預期兩次調用。間諜在每種測試方法之前重建。 – 2013-02-26 14:17:01

+0

對不起,我誤解了你的答案:-) – 2013-02-26 14:17:54

+0

謝謝,實際上它對我有幫助,但是如果你使用@InjectMocks和其他方法,你還需要調用那些看起來不那麼美麗的initmocks。 – 2013-02-26 14:28:41