2010-09-21 23 views
2

Je suis nouveau à Grails et l'erreur suivante:
No signature of method: Something.findAll() is applicable for argument types: (java.lang.String, java.util.ArrayList) values: [from Something AS s WHERE s.some_number LIKE ?, [%asdf%]]"Grails: Pas de signature de la méthode findAll() est applicable pour les types d'arguments: String, ArrayList

L'erreur se produit lorsque je lance test-app. Il se produit à l'endroit suivant:

SomethingVO[] findBySomeNumber(String searchString) { 
    searchString = "%"+searchString+"%" 
    return Something.findAll("from Something AS s WHERE s.some_number LIKE ?",[searchString]).collect { 
      new SomethingVO(it);  
    } 
} 

La classe Something est un objet de domaine:

package some.project.domain 

    class Something{ 

     static belongsTo = [product:Product, productVersion:ProductVersion] 

     Long id 
     String name 
     String someNumber 

     static constraints = { 
      product (nullable:true) 
      productVersion (nullable:true) 
     } 
    } 

Où est l'erreur?

(j'utilise Grails 1.2.4)

Répondre

4

findAll ne se moque pas lors de tests unitaires et c'est pourquoi votre code ne fonctionne pas. Vous devez ajouter manuellement un simulacre pour l'appel avant d'exécuter votre test (mockFor pourrait vous aider avec cela). Cela s'applique si vous utilisez HQL ou Criterias (que je recommanderais plus de HQL pur).

Alternativement, il est possible que vous puissiez résoudre vos problèmes en utilisant des viseurs dynamiques. Les finders dynamiques et les autres méthodes ORM dynamiques (save, get, count, ..) sont dans la plupart des cas (?) Des cas raillés lorsque vous appelez mockDomain(Something) dans votre test unitaire. Ils sont aussi généralement plus faciles à utiliser que HQL (imho).

Mise à jour: Merci à Fletch pour souligner que tous les viseurs dynamiques ne sont pas moqués. Un exemple de chercheur dynamique qui ne sera pas raillé est le suivant: Something.findAllWhereSomeNumberInList([1, 2, 3]).

Le HQL que vous utilisez dans votre code pourrait être réécrite comme ceci à l'aide de viseurs dynamiques:

Something.findBySomeNumberLike(searchString) 
+0

grande et rapide réponse. Merci beaucoup! – hering

+1

Bonne réponse, sauf que "Les finders dynamiques et les autres méthodes ORM dynamiques (save, get, count, ..) sont tous mockés lorsque vous appelez mockDomain (Quelque chose) dans votre test unitaire" n'est pas tout à fait vrai. Certaines de ces méthodes manquent aussi, par exemple FindAllWhereSomeNumberInList. – Fletch

+0

Merci fletch, je n'étais pas au courant que c'était le cas. Je vais mettre à jour la réponse pour réfléchir à cela. Savez-vous s'il y a une bonne liste de ce qui fonctionne et de ce qui ne fonctionne pas? Héritage: heureux d'être utile :) Je sais à quel point il peut être difficile de trouver toutes les informations dont vous avez besoin lorsque vous travaillez avec un nouveau cadre. – xlson

2

réponse de Xlson est une solution correcte, mais il existe une alternative « de pointe », vous pouvez essayer, qui est actuellement en statut de test. Voir http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html

+0

Je n'étais pas au courant de cela, je vais vérifier. Merci pour le conseil! – xlson

+0

Je l'ai essayé mais je n'ai pas réussi à le faire fonctionner. Beaucoup de dépendances ne sont pas résolues. J'essaie de tester un service qui a un findAll avec une requête simple et un peu de tri et de pagination. Quelle honte que ce n'est pas possible de tester :( – hering