2011-05-19 22 views
21

creé una clase y se reemplaza los método equals(). Cuando uso assertTrue(obj1.equals(obj2)), pasará la prueba; sin embargo, assertEquals(obj1, obj2) fallará la prueba. ¿Podría alguien decir la razón por qué?assertEquals JUnit() falla por dos objetos

+2

que necesitamos para ver el código para el método equals – hvgotcodes

+0

son '' obj1' y obj2' del mismo tipo? –

+0

¿Intentó en el modo de depuración que la igualdad anulada sea utilizada por assertEquals? – VirtualTroll

Respuesta

30

Supongo que no has actualmente reemplazado equals - que lo has sobrecargado. Utilice la anotación @Override para encontrar este tipo de cosas en tiempo de compilación.

En otras palabras, sospecho que tienes:

public boolean equals(MyClass other) 

donde se debe tener:

@Override // Force the compiler to check I'm really overriding something 
public boolean equals(Object other) 

En su aseveración de trabajo, que fueron, sin duda, una llamada al método sobrecargado como el tipo en tiempo de compilación de obj1 y obj2 eran tanto MyClass (o cualquiera que sea su clase se llama). JUnit's assertEquals solo llamará al equals(Object) ya que no conoce nada mejor.

+1

Funciona cuando cambio public boolean equals (MyClass other) a public boolean equals (Object other). Gracias Jon. –

+0

@nikel: El hecho de que 'date' es mutable hace que sea difícil de poner en práctica la igualdad muy bien - que podría tener un' 'HashSet , y una vez que habías mutado una entrada que no sería capaz de encontrar otra vez ... –

+0

volver a agregar el comentario - me pregunto por qué la fecha no anula su implementación iguales ... – nikel

1

Este es el código para assertEquals (de Github):

static public void assertEquals(String message, Object expected, 
     Object actual) { 
    if (expected == null && actual == null) 
     return; 
    if (expected != null && isEquals(expected, actual)) 
     return; 
    else if (expected instanceof String && actual instanceof String) { 
     String cleanMessage= message == null ? "" : message; 
     throw new ComparisonFailure(cleanMessage, (String) expected, 
       (String) actual); 
    } else 
     failNotEquals(message, expected, actual); 
} 

private static boolean isEquals(Object expected, Object actual) { 
    return expected.equals(actual); 
} 

No puedo pensar en un solo caso en el que este se comporta de la manera que usted describe - si su método equals no está manejando comparaciones a null valores correctamente.

+0

Estás suponiendo que el 'equals' llamado por JUnit es el mismo' equals' llamada en la versión que pasa ... –

+0

@ Jon Sí, acabo de notar que había adivinado correctamente el problema. –

Cuestiones relacionadas