2012-12-24 98 views
0

我想驗證一次模擬的調用是否只發生在某些期望的參數值上,而不會發生其他任何事情。如何驗證方法只能用期望的參數調用?

public interface ADependancy { 
    public void method(String parameter, String otherParameter); 
} 


public class Foo { 
    private ADependancy myHelper; 

    public Foo(ADependancy helper) { 
     this.myHelper = helper; 
    } 

    public void good() { 
     myHelper.method("expected","expected"); 
     myHelper.method("expected","expected"); 
     myHelper.method("expected","expected"); 
    } 

    public void bad() { 
     myHelper.method("expected","expected"); 
     myHelper.method("expected","UNexpected"); 
     myHelper.method("expected","expected"); 
    } 
} 

我嘗試這樣做:

public class FooTest extends TestCase { 
    private ADependancy mock =mock(ADependancy.class);; 
    private Foo foo = new Foo(mock); 

    @Test 
    public void testGood() { 
     foo.good(); 
     validateOnlyCalledWithExpected(); 
    } 

    @Test 
    public void testBad() { 
     foo.bad(); 
     validateOnlyCalledWithExpected(); 
    } 

    private void validateOnlyCalledWithExpected() { 
     verify(mock,atLeastOnce()).method(eq("expected"),eq("expected")); 
     verify(mock,never()).method(not(eq("expected")),not(eq("expected"))); 
    } 
} 

期待testBad失敗,而是測試通過。如果方法只接受一個參數,則按預期工作。

回答

3

這是一個邏輯錯誤。

我想斷言每個參數絕對不是預期值。但是相反,我實際上主張的是,它絕不會發生它們都不是預期的價值。 因此,與我有它的方式,它並沒有如期望的失敗,因爲事實上,某些觀點的預期值,因此該方法是從來沒有調用所有參數不是的預期值,並驗證通過。

因此,這適用於我想要的東西:

private void validateOnlyCalledWithExpected() { 
     verify(mock,atLeastOnce()).method(eq("expected"),eq("expected")); 
     verify(mock,never()).method(not(eq("expected")),anyString()); 
     verify(mock,never()).method(anyString(),not(eq("expected"))); 
    } 
4

你可以使用verifyNoMoreInteractions靜態方法,在http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#finding_redundant_invocations記錄。

verify(mock).method(eq("expected"),eq("expected")); 
verifyNoMoreInteractions(mock); 

或者,你可以寫

verify(mock).method(eq("expected"),eq("expected")); 
verify(mock,never()).method(anyString(),anyString()); 

因爲verify第二個電話會忽略已經被驗證了電話。

+0

我更喜歡這個,但它似乎不適用於我的示例。也許這是事實,我不止一次地調用方法? (見「atLeastOnce」); – derekv

+0

好的,然後把'atLeastOnce()'放進去。我沒有打擾,因爲你的問題很清楚你已經知道如何使用'atLeastOnce()'。 –

+0

不,我的意思是,它實際上不起作用,當我插入你的代碼給我的例子,然後_both_測試失敗......進一步檢查確定你的第一個snippit _does_似乎工作正常。這只是第二個snippit不起作用。 – derekv

相關問題