Wie verwende ich ExecuteQuery in Grails TestCase?
Frage
Wie verwende ich ExecuteQuery in Grails TestCase?
A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types: () values: []
Ich habe bereits Mockdomain angerufen.
Übrigens ist es im Unit -Test.
Vielen Dank!
Lösung
Es gibt noch keine Unterstützung für HQL -Abfragen in Unit -Tests, aber wir arbeiten daran. Aber Sie sollten keine Persistenz -Tests mit Mocks durchführen. Persistenztests sollten in einem Integrationstest gegen eine Datenbank durchgeführt werden.
Normalerweise bewege ich HQL -Abfragen in die Domänenklasse als statische Abfragemethoden. Auf diese Weise sind sie in einem Unit -Test eines Controllers, eines Dienstes usw. leicht zu verspotten, und dann teste ich die Methode als Teil des Integrationstests der Domänenklasse.
Zum Beispiel würde ich haben
class User {
String username
String password
...
static List findAllUsersBlahBlah(String foo, boolean bar) {
executeQuery('from User u where ...')
}
}
Dann kann ich in einem Unit -Test diese Methode mit gefälschten Daten verspotten, da es mir in einem Controller -Unit -Test egal ist. Ich weiß, dass sie an der richtigen Stelle ordnungsgemäß getestet wird und ich möchte mich auf die untersuchte Klasse konzentrieren, nicht auf seine Mitarbeiter:
def users = [new User(...), new User(...)]
User.metaClass.static.findAllUsersBlahBlah = { String foo, boolean bar -> users }
Andere Tipps
Wir haben ExecuteQuery mit Grails 2.0 in unserem Projekt erfolgreich verspottet
@TestFor(BookController)
@TestMixin([DomainClassUnitTestMixin,ServiceUnitTestMixin])
@ConfineMetaClassChanges([Book])
class BookControllerSpec extends Specification{
mockDomain(Book)
Book.metaClass.static.executeQuery = {a,b,c-> return [Book]}
In Grails 2.5.4 können Sie verwenden GroovyMock
Für die Verspottung statischer Methoden, die in Java implementiert sind:
GroovyMock(Book, global: true)
Ich habe gerade getestet - es funktioniert auch für _.executeQuery()