Comparar Objetos con atributos nulos

97 views
Skip to first unread message

Edson Chavez

unread,
Apr 10, 2013, 4:03:55 PM4/10/13
to agil...@googlegroups.com
Hola a todos estoy realizando tests a un metodo legado en lenguaje java con Junit y este en algunos casos devuelve objetos con atributos en null

inicialmente intente hacer un assertEquals(objetoEsperado, objetoObtenido)

el metodo toString para ambos objetos arroja lo siguiente:

objeto esperado:
TransactionUkcBean [number=5, typeFile=null, description=null, status=completed, dateCreated=2013-02-15T11:00:00.000-05:00, transactionTypeId=1, transactionTypeDescription=txType1, tracking=null, trackingStatus=null, trackingDateCreated=null, fechaInicial=null, fechaFinal=null, statusId=null, fileTypeId=null, detailsSize=4]


Objeto Obtenido
TransactionUkcBean [number=5, typeFile=null, description=null, status=completed, dateCreated=2013-02-15T11:00:00.000-05:00, transactionTypeId=1, transactionTypeDescription=txType1, tracking=null, trackingStatus=null, trackingDateCreated=null, fechaInicial=null, fechaFinal=null, statusId=null, fileTypeId=null, detailsSize=4]

como pueden ver son iguales atributo a atributo

el problema es que como imaginan el metodo equals() cuando los 2 valores a comparar son nulos (por ejemplo fechaInicial) falla miserablemente, me imagino que una forma es crear un metodo propio pasarle ambos objetos para evaluar cada atributo que se que no es nulo directamente, e incluir tambien una validacion de que los atributos nulos lo sean sin embargo esta salida se me hace algo fragil desde que implica que si en algun momento el metodo ya no devuelve null si no algun valor (cadenas vacias, objetos inicializados a algun dato estandar etc) implica modificar la implementacion del comparador, asi que queria consultar si alguien conoce alguna forma directa de hacer esto sin implementar mi propio comparador

Saludos

Lennon Shimokawa

unread,
Apr 10, 2013, 4:44:45 PM4/10/13
to agil...@googlegroups.com

Edson Chavez

unread,
Apr 10, 2013, 5:00:01 PM4/10/13
to agil...@googlegroups.com
Hola solo para comentar la solucion:

primero mea Culpa, si comparas 2 atributos de un objeto en null el metodo equals si pasa bien, me azotare al llegar a casa por soltar tremendo aerolito. 


Entonces cual es el problema? haciendo debug del metodo equals note que se caia al comparar fechas, el problema es que las fechas se usan con org.joda.time.Datetime y su equals compara dos cosas: milisengundos y Chronology, este ultimo contiene la zona horaria, asi que si tu objeto asi represente la misma hora por alguna razon fue creado con otra zona horaria, el equals fallara, ese era el caso esta vez la zona horaria en el objeto esperado era [-5:00] y en el objeto obtenido era: [lima/bogota] que cronologicamente son lo mismo si me lo preguntan pero bueno para el objeto es diferente asi que por eso fallaba

y solucione el tema modificando el equals en lugar de que compare por ejemplo 

dateCreated.equals(obj.dateCreated) 

hice que lo convierta a java.util.date

dateCreated.toDate().equals(obj.dateCreated.toDate())

que para el uso de fechas de este caso es suficiente 

gracias a todos por las respuestas :)

Saludos
--
Has recibido este mensaje porque estás suscrito a Grupo "Agile Perú" de
Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a agil...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
agileperu-...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com.pe/group/agileperu?hl=es.
---
Has recibido este mensaje porque estás suscrito al grupo "Agile Perú" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a agileperu+...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Lennon Shimokawa

unread,
Apr 10, 2013, 5:24:59 PM4/10/13
to agil...@googlegroups.com
Gracias por compartir la solución Edson.

Un consejo para el test, no comparar el objeto entero, sino solo los atributos relevantes para el objetivo del test.
De esta manera se puede evitar las particularidades de Java para el equals a nivel de objetos, además que el mensaje de Assert fallido da mucho mejor feedback.

Saludos!
Reply all
Reply to author
Forward
0 new messages