多個參數,我使用到的Mockito嘲笑有看起來像這樣的方法的類一致性:檢查使用的Mockito
setFoo(int offset, float[] floats)
我希望能夠驗證數組中的值(floats
)在預期值數組中相等(在給定容差內)。
問題是我想檢查從offset
指定的位置開始的floats
的內容。爲了測試的目的,我不知道/關心偏移量是什麼,只要它指向我期望的值即可。我也不在乎數組的其餘部分包含什麼。我只關心從提供的偏移量開始的值。
我該怎麼做?
多個參數,我使用到的Mockito嘲笑有看起來像這樣的方法的類一致性:檢查使用的Mockito
setFoo(int offset, float[] floats)
我希望能夠驗證數組中的值(floats
)在預期值數組中相等(在給定容差內)。
問題是我想檢查從offset
指定的位置開始的floats
的內容。爲了測試的目的,我不知道/關心偏移量是什麼,只要它指向我期望的值即可。我也不在乎數組的其餘部分包含什麼。我只關心從提供的偏移量開始的值。
我該怎麼做?
雖然部分模擬是不是一個壞主意,你如果您使用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());
}
這正是我所需要的。謝謝! –
你想要一個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()
'Mockito.CALLS_REAL_METHODS'似乎不能用於接口。我一直在嘗試調用接口上的真實方法時遇到錯誤。我在'doCallRealMethod()'方面取得了一些進展,但在另一個答案中提出的參數捕獲方法更容易工作,並且對於這種特殊情況需要更少的代碼。不管怎麼說,還是要謝謝你。 –
也許這只是我,但我不太明白你的問題。編寫你自己的方法時會遇到什麼問題,它將offset和2數組作爲參數,並檢查從offset開始的這些數組中的元素是否相等? –
@AndrewLogvinov如何在Mockito模擬對象上「寫我自己的方法」? –
我不認爲你應該。在調用setFoo()之後,你期望對象的狀態已經改變。所以你應該查詢對象的狀態並將它與你的值進行比較。有些代碼片段可以更好地理解問題。 –