42 votes

Mockito's Matcher contre Hamcrest Matcher ?

Cela va être facile, mais je n'arrive pas à trouver la différence entre les deux et à savoir laquelle utiliser, si j'ai les deux librairies incluses dans mon classpath ?

96voto

jhericks Points 2523

Retour des méthodes de matage Hamcrest Matcher<T> et les matchers de Mockito retournent 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 les matchers de Hamcrest que lorsqu'un Matcher<?> est attendu dans la signature - typiquement, dans l'objet assertThat appels. Lors de la mise en place d'attentes ou de vérifications où vous appelez des méthodes de l'objet fantaisie, vous utilisez les matchers de Mockito.

Par exemple (avec des noms entièrement qualifiés 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 matcheur Hamcrest dans un contexte qui requiert un matcheur Mockito, vous pouvez utiliser l'option org.mockito.Matchers.argThat correspondance. Il convertit un matcher Hamcrest en un matcher Mockito. Donc, disons que vous voulez faire correspondre une valeur double avec une certaine précision (mais pas beaucoup). Dans ce cas, vous pourriez le faire :

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

2voto

skaffman Points 197885

L'un ou l'autre - ils sont très similaires et font à peu près la même chose. Vous remarquerez que les matchers de Mockito étendent les matchers de base de Hamcrest.

Je préfère ceux de Hamcrest, ils donnent de meilleurs messages lorsque vos tests échouent, mais c'est juste une préférence personnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X