我正在使用Mockito来模拟一个类似于以下方法的类:
setFoo(int offset, float[] floats)
我希望能够验证数组中的值(floats
)是否与预期值数组中的值相等(在给定的容差范围内)。
问题是,我想从floats
指定的位置开始检查offset
的内容。出于测试的目的,我不知道/关心偏移是什么,只要它指向我期望的值。我也不在乎数组的其余部分包含什么。我只关心从提供的偏移量开始的值。
我该怎么做?
答案 0 :(得分:28)
虽然部分模拟不是一个坏主意,但如果您使用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());
}
答案 1 :(得分:1)
你想要一个partial mock。我们假设具有setFoo()
的类名为Bar:
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()