Prueba de integración de trabajo Grails Quartz - Trabajo no autocableado

Estoy escribiendo la prueba de integración para un trabajo de cuarzo en una aplicación de griales. tengo el trabajo en grails-aplicación/trabajos carpeta, y si inicio la aplicación funciona. El problema es que quiero obtenerlo en una prueba de integración, pero el autowire no funcionará. La prueba es como:

class MyJobTest{
    MyJob myJob
    def setUp(){
        assert myJob != null
    }

    def testExecute(){
         //test logic
    }

}

pero falla porque myJob es nulo... ¿alguna ayuda?

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

Los trabajos de cuarzo no se conectan automáticamente como los servicios en el entorno de prueba. La documentación para el trabajo de Quartz también establece explícitamente que, de manera predeterminada, no se ejecutará según lo programado en el entorno de prueba (puede cambiar eso si lo desea, pero yo no lo haría). solo instanciaría myJob = new MyJob() en tu setUp y llama al execute() método para probarlo. Si está tratando de probar los desencadenantes, es posible que desee encontrar una manera de ver lo que hay dentro del triggers {} ¿Quizás inspeccionando la metaclase?

EDITAR EN RESPUESTA AL COMENTARIO:

Nunca he sacado los servicios del contexto de la aplicación, por lo que podría funcionar. La forma en que probablemente lo probaría es la siguiente:

Suponiendo que tu clase se vea así:

class MyJob {
    def myServiceA
    def myServiceB

    def execute() {
        if(myJobLogicToDetermineWhatToDo) {
            myServiceA.doStuff(parameter)
        } else {
            myServiceB.doStuff(parameter)
        }

    }        
}

Lo que realmente quiere probar aquí es el myJobLogicToDetermineWhatToDo. Asumiría que tiene (o puede escribir fácilmente) pruebas de integración y/o unidad contra sus servicios myServiceA y myServiceB para asegurarse de que funcionan correctamente. Luego escribiría pruebas unitarias para probar la lógica/cableado de su Trabajo al servicio apropiado.

@Test
void routeOne() {
    def job = new MyJob()
    def myServiceA = new Object()
    def expectedParameter = "Name"
    def wasCalled = false
    myServiceA.metaClass.doStuff = {someParameter ->
        assert expectedParameter == someParameter
        wasCalled = true
    }
    job.myServiceA = myServiceA
    //Setup data to cause myServiceA to be invoked

    job.execute()

    assert wasCalled
}

Luego repita este proceso para todas las rutas que tiene a través de su trabajo. De esta manera, puede aislar sus pruebas hasta la parte más pequeña posible y probar la lógica del objeto que está invocando, no los servicios que está utilizando. Supongo que está utilizando un servicio porque la lógica allí está siendo utilizada por otra parte del sistema. Si está probando el servicio a través de este trabajo y, por alguna razón, el trabajo desaparece, debe volver a escribir sus pruebas para invocar el servicio directamente. La forma en que lo propuse tiene pruebas que prueban el servicio directamente y pruebas que simulan esas llamadas de servicio. Si el trabajo desaparece, simplemente eliminará las pruebas asociadas y no perderá ninguna cobertura de prueba. Un poco largo, pero así es como me acercaría a probarlo.

contestado el 03 de mayo de 12 a las 16:05

¡muchas gracias! El problema es que Quartz tiene algo de lógica en la ejecución y ejecuta algún método de los servicios... así que en la prueba tengo que instanciar la clase Job e inyectar yo mismo los servicios desde el contexto de la aplicación, ¿no? - rascio

Encontré otra solución: hay un comando en el complemento de cuarzo de grails: grails install-quartz-config. Esto creará el archivo QuartzConfig.groovy, donde es posible habilitar la carga de cosas de Quartz para las pruebas: entornos { prueba { cuarzo { autoStartup = false } } } Más detalles:Documentación de Grails - Nazar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.