2011-12-01 10 views
26

Eso va a ser fácil, pero no puedo encontrar la diferencia entre ellos y cuál usar, si tengo ambas lib's incluidas en mi classpath?Mockito's Matcher vs Hamcrest Matcher?

+0

relacionadas: [? Cómo hacer Mockito adaptadores de trabajo] (http://stackoverflow.com/a/22822514/1426891) –

Respuesta

71

métodos matcher Hamcrest vuelven Matcher<T> y Mockito adaptadores de T. retorno Así, por ejemplo: org.hamcrest.Matchers.any(Integer.class) devuelve una instancia de org.hamcrest.Matcher<Integer> y org.mockito.Matchers.any(Integer.class) devuelve una instancia de Integer.

Eso significa que solo puede utilizar los adaptadores de Hamcrest cuando se espera un objeto Matcher<?> en la firma, generalmente en llamadas assertThat. Al configurar las expectativas o verificaciones en las que está llamando a los métodos del objeto simulado, utiliza los emparejadores Mockito.

Por ejemplo (con nombres completos para mayor claridad):

@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 desea utilizar un matcher Hamcrest en un contexto que requiere un matcher Mockito, puede utilizar la matcher org.mockito.Matchers.argThat. Convierte un matcher Hamcrest en un matcher Mockito. Por lo tanto, supongamos que desea unir un doble valor con cierta precisión (pero no mucho). En ese caso, se podría hacer:

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

Simplemente observando que, en Mockito 2, el ' argThat' sobrecarga que funciona con Hamcrest 'Matcher's se movió' MockitoHamcrest'. [Novedades de Mockito 2] (https://github.com/mockito/mockito/wiki/What% 27s-new-in-Mockito-2#incompatible) lo explican en su sección "Cambios incompatibles con 1.10". –

Cuestiones relacionadas