15

私はMockitoを使用して、次のようなメソッドを持つクラスをモックしています。

setFoo(int offset, float[] floats)

floats配列( )の値が(指定された許容範囲内で)期待値の配列の値と等しいことを確認できるようにしたいと思います。

floatsキャッチは、で指定された位置から開始する内容を確認したいということですoffset。テストの目的上、オフセットが期待する値を指している限り、オフセットが何であるかはわかりません。また、配列の残りの部分に何が含まれているかは気にしません。提供されたオフセットから始まる値のみを気にします。

どうすればよいですか?

4

2 に答える 2

41

部分的なモックは悪い考えではありませんが、事後に値を取得する代わりに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());
}
于 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 に答える