2013-02-04 55 views
6

多個參數,我使用到的Mockito嘲笑有看起來像這樣的方法的類一致性:檢查使用的Mockito

setFoo(int offset, float[] floats) 

我希望能夠驗證數組中的值(floats )在預期值數組中相等(在給定容差內)。

問題是我想檢查從offset指定的位置開始的floats的內容。爲了測試的目的,我不知道/關心偏移量是什麼,只要它指向我期望的值即可。我也不在乎數組的其餘部分包含什麼。我只關心從提供的偏移量開始的值。

我該怎麼做?

+0

也許這只是我,但我不太明白你的問題。編寫你自己的方法時會遇到什麼問題,它將offset和2數組作爲參數,並檢查從offset開始的這些數組中的元素是否相等? –

+0

@AndrewLogvinov如何在Mockito模擬對象上「寫我自己的方法」? –

+0

我不認爲你應該。在調用setFoo()之後,你期望對象的狀態已經改變。所以你應該查詢對象的狀態並將它與你的值進行比較。有些代碼片段可以更好地理解問題。 –

回答

17

雖然部分模擬是不是一個壞主意,你如果您使用ArgumentCaptor而不是事後獲取值,可能會發現您的代碼更容易遵循。這是一個特殊的參數匹配器,可以跟蹤匹配的值。

// initialized with MockitoAnnotations.initMocks(); 
@Captor ArgumentCaptor<Integer> offsetCaptor; 
@Captor ArgumentCaptor<float[]> floatsCaptor; 
@Mock Bar bar; 

@Test 
public void valuesShouldBeCloseEnough() { 
    Sut sut = new Sut(bar); 
    sut.doSomething(); 
    verify(bar).setFoo(offsetCaptor.capture(), floatsCaptor.capture()); 

    // check values with assertValuesAreCloseEnough, declared elsewhere 
    assertValuesAreCloseEnough(offsetCaptor.getValue(), floatsCaptor.getValue()); 
} 
+0

這正是我所需要的。謝謝! –

1

你想要一個partial mock。讓我們假設有setFoo()類名爲酒吧:

private static abstract class AssertingBar implements Bar { 

    @Override 
    void setFoo(int offset, float[] floats) { 
    this.offset = offset; 
    this.floats = floats 
    } 

    public void verify(float[] expectedFloats, float delta) { 
    // do your verification here 
    } 
} 

@Test 
public void valuesShouldBeCloseEnough() { 
    AssertingBar bar = Mockito.mock(AssertingBar.class, Mockito.CALLS_REAL_METHODS); 

    Sut sut = new Sut(bar); 
    sut.doSomething(); 

    bar.verify(...); 
} 

如果Bar是一類,而不是一個接口,那麼你可以使用doCallRealMethod()

+0

'Mockito.CALLS_REAL_METHODS'似乎不能用於接口。我一直在嘗試調用接口上的真實方法時遇到錯誤。我在'doCallRealMethod()'方面取得了一些進展,但在另一個答案中提出的參數捕獲方法更容易工作,並且對於這種特殊情況需要更少的代碼。不管怎麼說,還是要謝謝你。 –