2012-05-17 16 views
8

¿Hay alguna herramienta/biblioteca que pueda generar automáticamente las pruebas para mi código hash e iguale los métodos que miran las variables de instancia involucradas en estos métodos?Generar pruebas unitarias para los métodos hashcode, equals y toString

+0

Qué IDE está usando? – buymypies

+0

Dichas pruebas no tienen un significado sustancial, pero en su mayoría introducen mantenimiento. –

+3

@MPlatvoet Realmente no estoy de acuerdo con usted, probar 'equals()' y 'hashcode()' podría ser importante especialmente si parte de su código se basa en gran medida en eso ('HashMap', prueba de igualdad que involucra herencia) –

Respuesta

6

guayaba utiliza this constructor de prueba para probar equals y hashCode.

3

toString() no debe tener ningún "contrato" que respetar, por lo que la prueba de unidad sería extraño y no útil.

Puede consultar este project con respecto a equals().

También hay un JUnit Addon EqualsHashCodeTestCase


Sobre el mismo tema:

+1

No veo por qué toString no podría tener una especificación, aunque nunca he probado la unidad por mí mismo. –

+0

Bueno, no dije que no podría pero no debería.'toString()' es la representación de cadena de un objeto para que sea legible por una persona (ver javadoc para Object), así que esto dice que básicamente no debería hacer nada "extremo" (es la representación del objeto, no una método comercial) y que devuelve un String hecho para ser leído por un ser humano, no para ser analizado. A partir de ahí, es fácil decir que 'toString' no debe ser probado en unidades (no" can not "o" shall not "). –

+0

Sí, si pruebas todas las clases, no tiene sentido. Tenga en cuenta que todavía es legal para una clase específica hacer un requisito más estricto sobre 'toString'. Hay un buen número de ejemplos en el propio JSE ('StringWriter',' StringBuilder', 'URL', ...). –

-1

Puede utilizar Apache EqualsBuilder y HashCodeBuilder para implementar equals y hashCode y así minimizar el riesgo de no hacerlo correctamente.

La prueba equals es simple, cree dos instancias con los valores de instancia iguales (por lo que esperará que sean iguales) e invoque igual en una instancia que pase la otra como parámetro, y debe esperar que devuelva verdadero: D

+1

La pregunta es, ¿cómo se puede probar que el contrato hashCode no está roto? ¿Cómo se deben implementar las pruebas, que se verifican después de dos cosas: 1. Si equals devuelve verdadero, entonces hashCode debe devolver los mismos valores. 2. Si hashCode devuelve valores diferentes, entonces equals debe devolver false. – mentallurg

1

EqualsVerifier es una gran biblioteca. A menudo me combinándolo con Reflections biblioteca para escanear automáticamente para ciertas clases y poner a prueba el contrato para todos ellos a la vez:

@Test 
    public void validateEqualsHashCodeToString() { 
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() 
     .setUrls(ClasspathHelper.forPackage("my.base.package")) 
     .filterInputsBy(new FilterBuilder() 
     .include(".*Dto.*") // include all Dto classes 
     .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well 
     .setScanners(new SubTypesScanner(false))); 

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(Object.class); 

    allDtoClasses.forEach(dtoClass -> { 
     logger.info("equals/hashCode tester testing: " + dtoClass); 
     EqualsVerifier.forClass(dtoClass).verify(); 

     try { 
     dtoClass.getDeclaredMethod("toString"); 
     } catch (NoSuchMethodException e) { 
     fail(dtoClass + " does not override toString() method"); 
     } 
    }); 
    } 
Cuestiones relacionadas