我正在使用 Mockito 来模拟一个类,该类的方法如下所示:
setFoo(int offset, float[] floats)
我希望能够验证数组 ( floats
) 中的值是否与预期值数组中的值相等(在给定的容差范围内)。
问题是我想检查floats
从指定位置开始的内容offset
。出于测试的目的,我不知道/关心偏移量是多少,只要它指向我期望的值。我也不关心数组的其余部分包含什么。我只关心从提供的偏移量开始的值。
我该怎么做呢?
While a partial mock isn't a bad idea, you might find your code easier to follow if you use an ArgumentCaptor instead to get the values after the fact. It's a special argument matcher that keeps track of the value it matches.
// 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());
}
你想要一个部分模拟。让我们假设具有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()