2012-02-17 13 views
5

¿Cómo uso executeQuery in grails testcase?¿Cómo uso executeQuery in grails testcase?

A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types:() values: [] 

Ya he llamado a mockDomain.

Por cierto, está en prueba unitaria.

Gracias!

Respuesta

14

Todavía no hay soporte para consultas HQL en pruebas unitarias, pero estamos trabajando en ello. Pero no deberías estar haciendo pruebas de persistencia con burlas. Las pruebas de persistencia deben hacerse contra una base de datos en una prueba de integración.

Normalmente muevo las consultas HQL a la clase de dominio como métodos de consulta estáticos. De esta forma son fáciles de simular en una prueba unitaria de un controlador, servicio, etc. y luego pruebo el método como parte de la prueba de integración de clase de dominio.

Por ejemplo Tendría

class User { 
    String username 
    String password 
    ... 

    static List findAllUsersBlahBlah(String foo, boolean bar) { 
     executeQuery('from User u where ...') 
    } 
} 

Luego, en una prueba de unidad que puede burlarse de ese método con datos falsos, ya no me importa acerca de la persistencia en una prueba de unidad de controlador - Yo sé que es probado adecuadamente en el lugar correcto y yo quiero centrar en la clase bajo prueba, no sus colaboradores:

def users = [new User(...), new User(...)] 
User.metaClass.static.findAllUsersBlahBlah = { String foo, boolean bar -> users } 
+0

Gracias, que realmente ayuda – LiCheng

+0

Probé otras soluciones primero, pero al final tiene que usar este, gracias –

+0

metaclassing puede causar más problemas si no limpia después de usar. fuiste advertido. –

8

Hemos burlado con éxito executeQuery con Grails 2.0 en nuestro proyecto

@TestFor(BookController) 
@TestMixin([DomainClassUnitTestMixin,ServiceUnitTestMixin]) 
@ConfineMetaClassChanges([Book]) 
class BookControllerSpec extends Specification{ 
    mockDomain(Book) 
    Book.metaClass.static.executeQuery = {a,b,c-> return [Book]} 
+0

Muchas gracias. – LiCheng

+0

No se olvide de aceptar (votar) la respuesta si funciona y lo ayuda :) – Saurabh

0

En Grails 2.5.4 se puede utilizar GroovyMock por burlarse de los métodos estáticos implementado en Java:

GroovyMock(Book, global: true) 

Acabo de prueba - que funciona también para _.executeQuery()

+0

Puede proporcionarnos una prueba de unidad de muestra que implemente esto. –

Cuestiones relacionadas