assertEquals
usa el método equals
para comparar. Hay una afirmación diferente, assertSame
, que utiliza el operador ==
.
Para comprender por qué ==
no debe usarse con cadenas, necesita comprender lo que hace ==
: realiza una comprobación de identidad. Es decir, a == b
comprueba si a
y b
se refieren al mismo objeto. Está integrado en el lenguaje y su comportamiento no puede ser modificado por diferentes clases. El método equals
, por otro lado, puede ser anulado por clases. Si bien su comportamiento predeterminado (en la clase Object
) es realizar una comprobación de identidad con el operador ==
, muchas clases, incluido String
, lo reemplazan para realizar una comprobación de "equivalencia" en su lugar. En el caso de String
, en lugar de verificar si a
y b
se refieren al mismo objeto, a.equals(b)
comprueba si los objetos a los que hacen referencia son cadenas que contienen exactamente los mismos caracteres.
Tiempo de analogía: imagine que cada objeto String
es un trozo de papel con algo escrito en él. Digamos que tengo dos pedazos de papel con "Foo" escrito en ellos, y otro con "Barra" escrito en él. Si tomo las dos primeras hojas de papel y uso ==
para compararlas, devolverá false
porque básicamente se está preguntando "¿son estas la misma hoja de papel?". No necesita ni siquiera mirar lo que está escrito en el papel. El hecho de que le doy dos hojas de papel (en lugar de la misma dos veces) significa que devolverá false
. Si utilizo equals
, sin embargo, el método equals
leerá los dos trozos de papel y verá que dicen lo mismo ("Foo"), por lo que devolverá true
.
El bit que se confunde con Strings es que Java tiene un concepto de "interning" Strings, y esto se realiza (efectivamente) automáticamente en cualquier literal de cadena en su código. Esto significa que si tiene dos literales de cadena equivalentes en su código (incluso si están en clases diferentes), ambos se referirán al mismo objeto String
. Esto hace que el operador ==
devuelva true
con más frecuencia de lo que cabría esperar.
Si no está seguro, puede leer el código o el Javadoc. Por cierto, si quiere probar que son el mismo objeto, puede usar assertSame. –
Si str1 y str2 son nulos, assertEquals() es verdadero, pero assertTrue (str1.equals (str2)) arroja una excepción. El primer ejemplo también imprimirá un mensaje de error útil como los contenidos de str1 y str2, el segundo no. –