2012-02-17 9 views
5

Come si usa executeQuery in Grails Testcase?Come si usa executeQuery in Grails Testcase?

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

Ho già chiamato mockDomain.

A proposito, è in test di unità.

Grazie!

risposta

14

Non c'è ancora supporto per le query HQL nei test di unità, ma ci stiamo lavorando. Ma non dovresti fare test di persistenza con i mock. I test di persistenza devono essere eseguiti su un database in un test di integrazione.

Solitamente trasferisco le query HQL alla classe di dominio come metodi di interrogazione statica. In questo modo sono facili da prendere in giro in un test di unità di un controller, servizio, ecc. E poi testare il metodo come parte del test di integrazione della classe dominio.

Per esempio avrei

class User { 
    String username 
    String password 
    ... 

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

Poi, in una prova di unità posso prendere in giro che il metodo con i dati falsi dal momento che non mi interessa la persistenza in una prova di unità di controllo - So che è correttamente testato nel posto giusto e voglio mettere a fuoco la classe in prova, non i suoi collaboratori:

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

Grazie, che aiuta veramente – LiCheng

+0

ho provato altre soluzioni prima, ma alla fine deve usare questo, grazie alla metamodellazione –

+0

può causare ulteriori problemi se non si pulisce dopo l'uso. sei stato avvertito. –

8

Abbiamo preso in giro con successo executeQuery con Grails 2.0 nel nostro progetto

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

Grazie mille. – LiCheng

+0

Si prega di non dimenticare di accettare (votare la risposta) la risposta se funziona e ti aiuta :) – Saurabh

0

In Grails 2.5.4 è possibile utilizzare per GroovyMock beffardo metodi statici implementate in Java:

GroovyMock(Book, global: true) 

ho appena provato - funziona anche per _.executeQuery()

+0

Puoi fornire un test unitario di esempio che lo implementa. –