web-dev-qa-db-ja.com

モッキートのマッチャーvsハムクレストマッチャー?

それは簡単なことですが、クラスパスに両方のライブラリが含まれている場合、どちらを使用するのか違いがわかりませんか?

38
tintin

Hamcrestマッチャーメソッドは_Matcher<T>_を返し、MockitoマッチャーはTを返します。たとえば、org.hamcrest.Matchers.any(Integer.class)は_org.hamcrest.Matcher<Integer>_のインスタンスを返し、org.mockito.Matchers.any(Integer.class)Integerのインスタンスを返します。

つまり、署名に_Matcher<?>_オブジェクトが必要な場合、通常はassertThat呼び出しでのみ、Hamcrestマッチャーを使用できます。モックオブジェクトのメソッドを呼び出す場所に期待値または検証を設定する場合は、Mockitoマッチャーを使用します。

例(わかりやすくするために完全修飾名を使用):

_@Test
public void testGetDelegatedBarByIndex() {
    Foo mockFoo = mock(Foo.class);
    // inject our mock
    objectUnderTest.setFoo(mockFoo);
    Bar mockBar = mock(Bar.class);
    when(mockFoo.getBarByIndex(org.mockito.Matchers.any(Integer.class))).
        thenReturn(mockBar);

    Bar actualBar = objectUnderTest.getDelegatedBarByIndex(1);

    assertThat(actualBar, org.hamcrest.Matchers.any(Bar.class));
    verify(mockFoo).getBarByIndex(org.mockito.Matchers.any(Integer.class));
}
_

Mockitoマッチャーを必要とするコンテキストでHamcrestマッチャーを使用する場合は、_org.mockito.Matchers.argThat_マッチャーを使用できます。 HamcrestマッチャーをMockitoマッチャーに変換します。したがって、double値をある程度の精度で一致させたい(ただしそれほどではない)とします。その場合、次のことができます。

_when(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))).
    thenReturn(mockBar);
_
94
jhericks