Estoy usando Java 8, Netbeans 8.2 y JUnit 4.12.
Tengo dos instancias de una clase que quiero comparar para saber si son "iguales", donde sus propiedades tienen los mismos valores. Es decir que si tienen id y nombre, si escribo en el test:
assertEquals(instanceA.getId(), instanceB.getId( ));
assertEquals(instanceA.getName(), instanceB.getName( ));
pasa OK, pero si añado un tercer assert comparándolos directamente:
assertEquals(instanceA, instanceB);
o bien
assertTrue(instanceA.equals(instanceB));
este falla. Creo que porque aunque guardan lo mismo son instancias diferentes (apuntan a diferentes direcciones de memoria). ¿Alguien puede aclararlo? Gracias.
Editado
La pregunta que se sugiere como "duplicado" se centra en comparar el valor de dos Strings y todas las respuestas van en este sentido, excepto esta: https://es.stackoverflow.com/a/42937/20709 que hace una comparación de objetos, obviando esta respuesta, todas las demás soluciones fallan. Mi pregunta se refiere a cómo comparar objetos de acuerdo al valor de sus propiedades y en concreto de cara a implementar test unitarios. Creo que revisando ambas preguntas y sus respuestas pueden verse similitudes pero está claro que son dos preguntas diferentes.
Tal vez no me explique correctamente. Si alguien no lo tiene claro, ¿si es la misma pregunta como tiene una solución completamente diferente?
Comparar dos strings:
String a = "hola";
String b = "hola";
boolean res = a.equals(b);
System.out.println("Comparando strings: " + res);
// Comparando strings: true
Comparar dos objetos:
class Foo {
private int id;
private String name;
public Foo(int id, String name) {
this.id = id;
this.name = name;
}
} // class
Foo a = new Foo(1, "hola");
Foo b = new Foo(1, "hola");
boolean res = a.equals(b);
System.out.println("Comparando objetos: " + res);
// Comparando objetos: false
¿Qué ha pasado? Pues eso es lo que estaba preguntando básicamente...