15

我正在使用 Mockito 来模拟一个类,该类的方法如下所示:

setFoo(int offset, float[] floats)

我希望能够验证数组 ( floats) 中的值是否与预期值数组中的值相等(在给定的容差范围内)。

问题是我想检查floats从指定位置开始的内容offset。出于测试的目的,我不知道/关心偏移量是多少,只要它指向我期望的值。我也不关心数组的其余部分包含什么。我只关心从提供的偏移量开始的值。

我该怎么做呢?

4

2 回答 2

41

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());
}
于 2013-02-05T04:44:25.757 回答
1

你想要一个部分模拟。让我们假设具有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()

于 2013-02-04T23:29:46.143 回答