使用Mockito检查多个参数的一致性

时间:2013-02-04 20:14:50

标签: java mocking mockito

我正在使用Mockito来模拟一个类似于以下方法的类:

setFoo(int offset, float[] floats)

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

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

我该怎么做?

2 个答案:

答案 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()