2012-03-13 18 views
7

Estoy intentando hacer una burla simple de una clase de dominio dentro de una prueba unitaria para un servicio de Grails según el seguimiento de la documentación, pero parece que no funciona en absoluto, en las consultas por casos siempre devolver nulo. ¿Me estoy perdiendo algo simple? Aquí está la parte pertinente de mi código, alteré nombres de las clases y métodos de ensayo para mayor claridad:Llamada de MockDomain que proporciona datos del dominio del dispositivo que no funciona, ¿qué me estoy perdiendo? Grails 2.0.1

@TestFor(MyService) 
@TestMixin(DomainClassUnitTestMixin) 

class MyServiceTests { 


    void testMyThing() { 
     defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant? 

     MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method. 
      println("dirty check called"); 
     } 

     mockDomain(MyUser, [ 
       [username: "[email protected]", accountType: UserType.STANDARD, id: 1L], 
       [username: "[email protected]", accountType: UserType.STANDARD, id:3L], 
       [username: "[email protected]", accountType: UserType.BUSINESS, id:2L] 
     ]) 

     MyUser user1 = MyUser.get(1); 
     System.out.println("user 1: ${user1}"); // output is 'user 1: null' 

     MyUser user1byName = MyUser.findByUsername("[email protected]"); 
     System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null' 

     ... the actual testing stuff which would love to have non null MyUser objects ... 
}   
} 
+0

¿Has intentado añadir @Mock (MyUser)? –

+0

@tomas Sí, lo hice, sin efecto. Dada la documentación, no debería ser necesario al usar mockDomain() – Peter

Respuesta

11

lo he descubierto, y se podría pensar que habría pensado en esto, yo les ha picado previamente por eso. El problema era con la validación, y el comportamiento GORM predeterminado de Grails de no poder mantener los datos en save() (que mockDomain debe usar cuando pasas los datos para tus instancias simuladas) si la clase Domain tiene errores de validación. MyUser requirió una contraseña no en blanco. Hace

largo añadí a mi grails.gorm.failOnError=true Config.groovy para mi aplicación por lo que nunca pienso más en eso, pero por supuesto que no consigue leer en el equipo realiza un test para

En mi opinión, esto hace que la firma del mockDomain muy frágil (y no pude encontrar una forma de configurar failOnError = true). Cambié la configuración de datos falsos a la siguiente, que tiene exactamente el mismo resultado, pero da error inmediato si configuras tus datos incorrectamente.

@Mock(MyUser) 
class MyServiceTests { 
    ... 

    void testMyThing() { 
     new MyUser(username: "[email protected]", 
        accountType: UserType.STANDARD, 
        id: 1L).save(failOnError:true) //throws exception because MyUser requires password field to be non blank 
    ... 
    } 
} 
+1

. Perdí una hora desconcertante con el mismo problema, hasta que encontré esto. ¡Gracias hombre! – elias

+1

Estaba usando el complemento "compilar-prueba-datos", y ese funcionó ... pero el nuevo MyUser (...) no lo hizo. Entonces el problema estaba un poco camuflado. Muy complicado, y esta respuesta ayudó a –

+0

¡Esta respuesta me salvó golpeándome la cabeza contra la pared durante otra hora! Buen descubrimiento, y estoy seguro de que todos nos morderán de nuevo alguna vez. – spikeheap

Cuestiones relacionadas