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

2022-09-03 03:46:56

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

setFoo(int offset, float[] floats)

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

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

我该怎么做?


答案 1

虽然部分模拟不是一个坏主意,但如果您使用 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());
}

答案 2

你想要一个部分模拟。假设具有的类名为 Bar: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(...); 
}

如果 是类,而不是接口,则可以使用BardoCallRealMethod()


推荐