2010-12-15 98 views
2

J'écris un Spec Spock (test unitaire) pour un service Grails 1.3.5, et j'ai couru à travers l'erreur suivante:Quelles sont les restrictions de la méthode mockDomain() de Grails?

No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]] Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;) 

groovy.lang.MissingMethodException: No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]] 
Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;) 
    at grails.test.MockUtils.addDynamicFinders_closure56(MockUtils.groovy:641) 
    at myapp.MyService.getCards(MyService.groovy:8) 
    at myapp.MyServiceSpec.getCards returns empty map if no cards or statuses are available(MyServiceSpec.groovy:13) 

Auparavant, ce test a réussi, mais le défaut a eu lieu quand je modifié mon service pour inclure le tri des résultats dans la méthode getThings().

class MyService { 
    static transactional = true 

    static getThings() { 
     Thing.findAll(sort: 'index', order: 'asc') 
    } 
} 

Cela semble encore fonctionner lorsque l'application est exécutée, alors je soupçonne que c'est une limitation de la mise en œuvre de mockDomain().

class MyServiceSpec extends UnitSpec { 
    def 'mockDomain has some limits, i suspect'() { 
     given: 
      mockDomain(Thing) 
      def myService = new MyService() 
     when: 
      myService.getThings() 
     then: 
      true 
    } 
} 

Donc ma question est-ce que leurs différences dans les méthodes ajoutées à une classe de domaine en utilisant mockDomain() plutôt que d'utiliser la vraie classe de domaine lors de l'exécution? Si c'est vrai, que sont-ils?

+0

Je voulais tagger avec SPOCK mais je n'ai pas assez de rep pour créer l'étiquette. – Armand

Répondre

3

sort et order sont des paramètres de critères Hibernate, ils ne fonctionneront pas avec MockDomain() - cela n'implique pas Hibernate. Heureusement.

Vous pouvez railler que vous signature findAll(), en utilisant tableau instances - le deuxième paramètre de MockDomain(), (EDIT) comme, cela l'emporte sur la signature findAll(Map) de Thing:

List<Thing> thingInstances = [] 

void setUp() { 
    mockDomain(Thing, thingInstances) 

    Thing.metaClass.`static`.findAll = { Map m -> 
     def result = thingInstances.sort{ it."${m.order}" } 
     m.order == 'asc' ? result : result.reverse() 
    } 
} 

(EDIT fin)

Ou vous pouvez faire un test d'intégration, alors il fonctionnera pendant des siècles. Ce que je ne recommande pas.

+0

merci, je n'ai pas réalisé la distinction Hibernate/GORM. Comment puis-je ajouter la méthode 'findAll()' aux arguments de 'mockDomain()'? J'ai compris que le second argument était des instances de 'Thing' qui apparaîtraient dans le domaine, plutôt que des méthodes à ajouter à Thing. – Armand

+0

J'ai édité la réponse pour ajouter un échantillon. Désolé, je n'étais pas clair. –

+0

qui me rend un peu malade :-(Dois-je faire cela à chaque test? – Armand