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 ?
Réponses
Trop de publicités?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);
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.