Pregunta

Es allí una manera de burlarse de la construcción de objetos utilizando JMock en Java?

Por ejemplo, si tengo un método como tal:

public Object createObject(String objectType) {
    if(objectType.equals("Integer") {
        return new Integer();
    } else if (objectType.equals("String") {
        return new String();
    }
}

...hay una manera de burlarse de la expectativa de la construcción de objetos en un método de prueba?

Me gustaría ser capaz de colocar las expectativas de que ciertos constructores son llamados, en lugar de tener un poco más de código para comprobar el tipo (ya que no siempre es tan complicado y simple como mi ejemplo).

Así que en lugar de:

assertTrue(a.createObject() instanceof Integer);

Yo podría tener una expectativa de que el constructor se llama.Sólo para hacer un poco más limpio, y expresar lo que en realidad está siendo probado en una manera más legible.

Por favor, disculpe la simple ejemplo, el problema real en el que estoy trabajando es un poco más complicado, pero tener la expectativa sería una simplificación.


Para un poco más de fondo:

Tengo una simple método de fábrica, que crea un contenedor de objetos.Los objetos que se están envueltos puede requerir parámetros que son difíciles de obtener en una clase de prueba (es el código pre-existente), por lo que es difícil de construir.

Quizás más cerca de lo que en realidad estoy buscando es:es allí una manera de burlarse de toda una clase (utilizando CGLib) en un solo golpe, sin especificar cada método a punta de fuera?

Así que el simulacro es estar envuelto en un constructor, por lo que obviamente métodos que pueden ser llamados en él, es JMock capaz de dinámica burlándose de cada método?

Mi conjetura es que no, como que iba a ser bastante complicado.Pero al saber que estoy ladrando al árbol equivocado es también interesante :-)

¿Fue útil?

Solución

La única cosa que puedo pensar es en tener el método de crear al objeto de fábrica, lo que haría que el simulacro.

Pero en términos de burlarse de una llamada al constructor, no.Burlarse de los objetos debe presuponer la existencia del objeto, mientras que un constructor presupone que el objeto no existe.Al menos en java, donde la asignación e inicialización de suceder juntos.

Otros consejos

jmockit puede hacer esto.

Ver mi respuesta en https://stackoverflow.com/questions/22697#93675

Por desgracia, creo que soy culpable de haciendo la pregunta equivocada.

El simple fábrica estaba tratando de probar, parecía algo así como:

public Wrapper wrapObject(Object toWrap) {
    if(toWrap instanceof ClassA) {
        return new Wrapper((ClassA) toWrap);
    } else if (toWrap instanceof ClassB) {
        return new Wrapper((ClassB) toWrap);
    } // etc

    else {
        return null;
    }
}

Yo estaba haciendo la pregunta de cómo saber si "nueva ClassAWrapper( )" fue llamado debido a que el objeto toWrap era difícil de obtener en una prueba aislada.Y el contenedor (si es que puede incluso ser llamado de esa) es una especie de extraño, ya que utiliza la misma clase para envolver objetos diferentes, simplemente utiliza diferentes constructores[1].Sospecho que si le hubiera preguntado a la pregunta un poco mejor, me gustaría tener que rápidamente recibió la respuesta:

"Usted debe burlarse de Objeto toWrap para que coincida con las instancias que se está probando en diferentes métodos de prueba e inspeccionar el Contenedor resultante de objetos para encontrar el tipo correcto se devuelve...y espero que tengas la suerte de que usted no tiene que burlarse de todo el mundo para crear las diferentes instancias ;-)"

Ahora tengo una buena solución para el problema inmediato, gracias!

[1] la apertura de la cuestión de si esto debe ser refactorizado está fuera del alcance de mi actual problema :-)

Está usted familiarizado con La Inyección De Dependencia?

Si no, entonces usted ceartanly pueden beneficiarse de aprender acerca del concepto.Supongo que la buena vieja Contenedores de inversión de Control y el patrón de Inyección de dependencias por Martin Fowler servirá como una buena introducción.

Con la Inyección de dependencias (DI), debe tener un DI contenedor de objeto, que es capaz de crear todo tipo de clases para usted.A continuación, el objeto de utilización del contenedor DI a instancias de las clases y se burlaba de la DI contenedor para probar que la clase crea instancias de espera clases.

La Inyección de dependencia o de Inversión de Control.

Alternativamente, puedes utilizar el patrón de diseño Abstract Factory patrón de diseño para todos los objetos que crea.Cuando usted está en la Unidad en modo de Prueba, inyectar una Prueba de Fábrica que le dirá lo que estás creando, a continuación, incluir la afirmación de código en las Pruebas de Fábrica para comprobar los resultados (inversión de control).

Dejar el código lo más limpio posible crear un interior protegido de la interfaz, implementar la interfaz (de fábrica) con el código de la producción como una clase interna.Agregar una variable estática tipo de interfaz inicializado a su valor predeterminado de fábrica.Agregar estática definidor de la fábrica y ya está.

En el código de prueba (debe estar en el mismo paquete, de lo contrario la interfaz interna debe ser público), crear una clase interna anónima o con la afirmación de código y el código de prueba.A continuación, en su prueba, inicializar la clase de destino, asignar (inyectar) la prueba de la fábrica, y ejecutar los métodos de su clase de destino.

Espero que no haya ninguno.Se burla de las que se supone son para burlarse de interfaces, las cuales no tienen los constructores...sólo los métodos.

Algo parece estar mal en su enfoque de la prueba aquí.Alguna razón por la que usted necesita para probar que explícita constructores son llamados ?
Afirmar que el tipo de objeto devuelto parece bien para las pruebas de fábrica de las implementaciones.Tratar createObject como una caja negra..examinar lo que se devuelve, pero no controlar las decisiones de cómo lo hace.A nadie le gusta eso :)

Actualización sobre la Actualización: Ouch!Medidas desesperadas para tiempos desesperados eh?Me sorprendería si JMock permite que...como me dijo que trabaja en las interfaces..no tipos de hormigones.Así

  • Intentar y gastar un poco de esfuerzo en conseguir esos molestos objetos de entrada 'instantiable' bajo el instrumento de prueba.Ir de Abajo hacia arriba en su enfoque.
  • Si eso no es factible, probar manualmente con puntos de interrupción (sé que es una mierda).Luego se pega un "Toque a su propio riesgo" comentario en una zona visible en el archivo de origen y seguir adelante.Luchar otro día.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top