45

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

4

1 に答える 1

99

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(またはMockito 2org.mockito.hamcrest.MockitoHamcrest.argThatで) を使用できます。Hamcrest マッチャーを Mockito マッチャーに変換します。したがって、double 値をある程度の精度で (しかしそれほどではなく) 一致させたいとします。その場合、次のことができます。

when(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))).
    thenReturn(mockBar);
于 2011-12-02T02:26:33.073 に答える