unitarias tutorial tipos pruebas herramientas framework español ejemplo java unit-testing tdd

tutorial - pruebas unitarias java netbeans



Comprobación de los resultados de una fábrica en una prueba unitaria (4)

Como no sé cómo es su método de fábrica, todo lo que puedo aconsejar ahora es

  1. Verifique que el objeto sea la implementación concreta correcta que estaba buscando:

    IMyInterface fromFactory = factory.create(...); Assert.assertTrue(fromFactory instanceof MyInterfaceImpl1);

  2. Puede verificar si la configuración de fábrica de las instancias concretas con variables de instancia válidas.

He desarrollado algunas clases con un comportamiento similar, todas implementan la misma interfaz. Implementé una fábrica que crea el objeto apropiado y devuelve la interfaz. Estoy escribiendo una prueba unitaria para la fábrica. Todo lo que obtienes es una interfaz para el objeto. ¿Cuál es la mejor manera de probar que la fábrica ha funcionado correctamente?

Me gustaría saber la respuesta en Java, pero si hay una solución que cruza idiomas, me gustaría saberlo.

El número 2. en la respuesta, ¿se haría como la otra respuesta? Si es así, marcaré la otra respuesta aceptada también y volveré a redactar mi pregunta para dirigirte a una fábrica donde se devuelve una interfaz y no tienes idea de qué tipo de clase concreta implementó la interfaz, y el caso en el que sabes qué clase concreta era usado.


@ cem-catikkas Creo que sería más correcto comparar los valores getClass (). getName (). En el caso de que la clase MyInterfaceImpl1 esté subclase, su prueba podría romperse, ya que la subclase es instancia de MyInterfaceImpl1. Reescribiría de la siguiente manera:

IMyInterface fromFactory = factory.create(...); Assert.assertEquals(fromFactory.getClass().getName(), MyInterfaceImpl1.class.getName());

Si crees que esto podría fallar de alguna manera (no me lo puedo imaginar), realiza las dos verificaciones.


if (myNewObject instanceof CorrectClass) { /* pass test */ }

actualizar:

No sé por qué esto se redujo, así que lo ampliaré un poco ...

public void doTest() { MyInterface inst = MyFactory.createAppropriateObject(); if (! inst instanceof ExpectedConcreteClass) { /* FAIL */ } }


Lo que estás tratando de hacer no es la Unidad de Pruebas

Si prueba si los objetos devueltos son instancias de clases concretas específicas, no es una prueba unitaria. Eres una prueba de integración. Si bien las pruebas de integración son importantes, no es lo mismo.

En las pruebas unitarias, solo necesita probar el objeto en sí. Si afirma en el tipo concreto de los objetos abstractos devueltos, está probando la implementación del objeto devuelto.

Pruebas unitarias de objetos en general

Cuando pruebas unitarias, hay cuatro cosas, quieres afirmar:

  1. Los valores de devolución de las consultas (métodos no válidos) son lo que usted espera que sean.
  2. Los efectos secundarios de los comandos (métodos de vacío) modifican el objeto en sí como usted espera.
  3. Se reciben los comandos enviados a otros objetos (esto generalmente se hace usando simulaciones).

Además, solo desea probar lo que se puede observar desde una instancia de objeto, es decir, la interfaz pública. De lo contrario, te vinculas a un conjunto específico de detalles de implementación. Esto requeriría que cambies tus pruebas cuando cambien esos detalles.

Prueba de unidad Factories

Las pruebas unitarias en Factories no son realmente interesantes, porque no está interesado en el comportamiento de los objetos devueltos de las consultas . Ese comportamiento (afortunadamente) se prueba en otro lugar, presumiblemente mientras se prueba el objeto por sí mismo. Solo está realmente interesado en si el objeto devuelto tiene el tipo correcto, lo cual está garantizado si su programa se compila.

Como las fábricas no cambian con el tiempo (porque entonces serían "Constructores", que es otro patrón), no hay comandos para probar.

Las fábricas son responsables de crear instancias de los objetos, por lo que no deben depender de otras fábricas para hacer esto por ellos. Podrían depender de un Constructor, pero aún así, no se supone que podamos probar la corrección del Constructor, solo si el Constructor recibe el mensaje o no.

Esto significa que todo lo que tiene que probar en Factories es si envían los mensajes a los objetos de los que dependen o no. Si usa Inyección de Dependencia, esto es casi trivial. Solo fíjate en las dependencias en las pruebas de tu unidad y verifica que reciban los mensajes.

Resumen de pruebas de la unidad Fábricas

  1. ¡No pruebe el comportamiento ni los detalles de implementación de los objetos devueltos! ¡Su fábrica no es responsable de la implementación de las instancias de objetos!
  2. Pruebe si los comandos enviados a las dependencias se reciben o no.

Eso es. Si no hay dependencias, no hay nada que probar. Excepto tal vez para afirmar que el objeto devuelto no es una referencia null .

Pruebas de integración Fábricas

Si tiene un requisito de que el tipo de objeto abstracto devuelto sea una instancia de un tipo concreto específico, entonces esto cae bajo prueba de integración.

Otros aquí ya han respondido cómo hacer esto usando el operador instanceof .