web-dev-qa-db-fra.com

Matcher de Mockito vs Matcher Hamcrest?

Ça va être facile, mais je ne trouve pas la différence entre eux et lequel utiliser, si j'ai les deux lib inclus dans mon chemin de classe?

38
tintin

Les méthodes de matcher Hamcrest renvoient Matcher<T> Et les apparieurs Mockito renvoient T. Ainsi, par exemple: org.hamcrest.Matchers.any(Integer.class) renvoie une instance de org.hamcrest.Matcher<Integer> Et org.mockito.Matchers.any(Integer.class) renvoie une instance de Integer.

Cela signifie que vous ne pouvez utiliser des comparateurs Hamcrest que lorsqu'un objet Matcher<?> Est attendu dans la signature - généralement, dans les appels assertThat. Lorsque vous configurez des attentes ou des vérifications où vous appelez des méthodes de l'objet factice, vous utilisez les égaliseurs Mockito.

Par exemple (avec des noms complets pour plus de clarté):

@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));
}

Si vous souhaitez utiliser un matcher Hamcrest dans un contexte qui nécessite un matcher Mockito, vous pouvez utiliser le matcher org.mockito.Matchers.argThat. Il convertit un matcher Hamcrest en un matcher Mockito. Supposons donc que vous vouliez faire correspondre une valeur double avec une certaine précision (mais pas beaucoup). Dans ce cas, vous pourriez faire:

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