2012-08-13 26 views
12

Necesito obtener las dependencias inyectadas en mis objetos de dominio en mis pruebas.Inyectar dependencias en la prueba de especificación de Grails Spock

Estas pruebas se colocan en el directorio de prueba/integración y se extienden desde spock.lang.Specification.

¿Cómo puedo lograrlo?

Nota: He visto esta publicación How to inject spring beans into spock test, pero no está relacionada con los griales.

Editar:

La dependencia quiero conseguir inyectado es springSecurityService en mi SecUser subclase llamada Player. El método que está fallando es el encodePassword(), que se llama en el beforeInsert().

que pueden burlarse de este método encodePassword() en algunas pruebas, pero cuando quiero probar mi método controladores save(), no puede burlarse de la Player que se está creando, porque todo sucede dentro del método controladores.

Después de cambiar para extender IntegrationSpec, este es mi código de prueba:

package intertigre.test.domain 
import intertigre.domain.Fecha; 
import intertigre.test.util.DomainFactoryTestService 
import grails.plugin.spock.IntegrationSpec 
import grails.test.mixin.TestFor 

    @TestFor(Fecha) 
    class FechaSpec extends IntegrationSpec{ 

    DomainFactoryTestService domainFactoryTestService = new DomainFactoryTestService() 

    def 'test'(){ 
     given: 
      def fecha = new Fecha() 
     when: 
      fecha.save() 
     then: 
      Fecha.get(1) == fecha 
    } 

} 

estoy recibiendo esta excepción cuando se ejecuta grails test-app :spock:

java.lang.NullPointerException: Cannot get property 'mainContext' on null object 
    at grails.plugin.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy) 

Y éste cuando corro la prueba por sí sola:

| Failure: intertigre.test.domain.FechaSpec 
| java.lang.NullPointerException: Cannot get property 'autowireCapableBeanFactory' on null object 
    at grails.plugin.spock.IntegrationSpec.setupSpec(IntegrationSpec.groovy:47) 
| Failure: intertigre.test.domain.FechaSpec 
| java.lang.NullPointerException: Cannot invoke method isActive() on null object 
    at grails.test.mixin.support.GrailsUnitTestMixin.shutdownApplicationContext(GrailsUnitTestMixin.groovy:232) 
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176) 
    at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145) 
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84) 
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:176) 
+0

'@ AutoWired', tal vez? ¿Se está ejecutando su aplicación Grails cuando ejecuta sus pruebas? – Will

+0

¿Tal vez es una mejor idea burlarse de estas dependencias? ¿Qué dependencias no se inyectan? Escribe un código de ejemplo para mostrar un problema. –

+0

Nunca he intentado usar @Autowired en Grails, lo intentaré. No estoy ejecutando la aplicación cuando ejecuto las pruebas. –

Respuesta

12

Intente declarar el springSecurityService en la prueba, como lo harías en un controlador. Griales se supone que debe hacer todo el trabajo para ti :)

Para una prueba de integración se hace algo como esto:

package intertigre.test.domain 
import intertigre.domain.Fecha; 
import intertigre.test.util.DomainFactoryTestService 
import grails.plugin.spock.IntegrationSpec 

class DomainFactoryTestServiceSpec extends IntegrationSpec{ 

def domainFactoryTestService // you dont need to create a new instance, it's injected by spring 

def 'test'(){ 
    given: 
     // ... 
    when: 
     // ... 
    then: 
     // .... 
} 

Si necesita probar un objeto de dominio específico (como la clase Fecha), se probablemente necesitará una prueba de unidad, algo como esto:

package intertigre.test.domain 
import intertigre.domain.Fecha 
import intertigre.test.util.DomainFactoryTestService 
import grails.test.mixin.TestFor 
import grails.test.mixin.Mock 
import spock.lang.Specification 

@TestFor(Fecha) 
@Mock([OtherObject1, OtherObject2]) 
class FechaSpec extends Specification { 

def domainFactoryTestService // same thing here, if you need the service 

def 'test'() { 
    given: 
     def fecha = new Fecha() 
    and: 
     def oo1 = new OtherObject1() 
    when: 
     // ... 
    then: 
     // .... 
} 

puede utilizar unidad de prueba para probar los servicios, así, depende de lo que se va a probar (una clase -el servicio- o una "situación" - la forma en que se usa el servicio-).

Ps. Por supuesto, este código aquí no ha sido probado y puede contener errores tipográficos. :) Pero espero que entiendas mi punto sobre cómo probar.

+0

En realidad estoy ampliando la especificación en lugar de IntegrationSpec. Cuando trato de cambiar de extender IntegrationSpec, me sale el siguiente excepción al ejecutar las pruebas: java.lang.NullPointerException:. No se puede obtener la propiedad 'mainContext' de objeto nulo \t en grails.plugin.spock.IntegrationSpec $ spock_initializeSharedFields (IntegrationSpec.groovy) –

+0

Debe extender IntegrationSpec mientras realiza una prueba de integración https://code.google.com/p/grails-spock-examples/wiki/Overview#Integration_tests ¿Hay algún punto en el que declare que null mainContext ? ¿Qué versión del complemento de spock está usando actualmente? ¿Puedes agregar un pedazo de código para echar un vistazo? – lucke84

+0

Estoy usando el complemento ": spock: 0.6". Nunca declaro mainContext como una variable. He actualizado la pregunta con mi código de prueba –

1

La respuesta anterior aceptada es válida para pruebas unitarias de controladores que necesitan clases de servicio inyectadas.

Si definió otros granos gestionados por resorte en los recursos.maravilloso y los necesita inyectarse puede añadir esta línea en la parte superior de su clase de especificaciones

static loadExternalBeans = true //<-- loads resources.groovy beans 

Fuente: http://grails.github.io/grails-doc/2.4.4/guide/testing.html#unitTesting

Adición loadExternalBeans = verdadera definición campo estático a una clase de prueba de unidad hace que los griales el tiempo de ejecución de la prueba unitaria carga todas las definiciones de bean de los archivos grails-app/conf/spring/resources.groovy y grails-app/conf/spring/resources.xml.

Cuestiones relacionadas