Estoy tratando de entender por qué agregar equalTo hace que mi prueba falle. He recreado el problema con una clase y una prueba simples.

La primera prueba pasa y la segunda falla.

Clase de muestra

public class Class {

Map<String, Boolean> data = new HashMap<>();

public Map<String, Boolean> getData(boolean access) {
    if (!access) 
        return null;
    return data;
}}

Clase de prueba

public class ClassTest {

@InjectMocks
private Class testObj;

@Test
public void testGetDataNull() {
    assertThat(testObj.getData(false), is(nullValue()));
}

@Test
public void testGetDataNull2() {
    assertThat(testObj.getData(false), is(equalTo(nullValue())));
}}

La prueba que falla muestra este mensaje de error

Expected: is <null>
  but: was null

P: ¿Cuál es la diferencia entre estos?

¡Cualquier idea es muy apreciada!

0
dreamer 16 dic. 2016 a las 00:22

2 respuestas

La mejor respuesta

Es porque nullValue() devuelve un objeto org.hamcrest.core.isNull. Entonces no es igual a null, es un objeto. Sin embargo, ese objeto contiene un método matches que solo coincidirá con null, por lo que is funciona.

Como acotación al margen, la prueba probablemente debería leer assertNull(testObj.getData(false))

0
Adam 15 dic. 2016 a las 21:40

Su pregunta es en realidad sobre Hamcrest, no sobre Mockito.

Está probando si el valor real, es decir, testObj.getData(false), que es null, es igual al valor devuelto por nullValue(), que es una instancia del comparador IsNull (). Una instancia de IsNull no es igual a null, de ahí el error.

Recomiendo evitar Hamcrest, que en mi opinión es más difícil de usar correctamente y menos elegante que AssertJ.

Con AssertJ, escribirías

assertThat(testObj.getData(false)).isNull();

Ya no hay método estático para adivinar, y en su lugar, afirmaciones fluidas válidas autocompletadas.

0
JB Nizet 15 dic. 2016 a las 21:40