2010-09-21 59 views
2

我是新来的Grails并收到以下错误:当我运行test-app
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:方法的findAll()是适用于参数类型的无签名:字符串,ArrayList的

出现的错误。它发生在以下地方:

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

Something是一个域对象:

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) 
     } 
    } 

哪里错了吗?

(我用的Grails 1.2.4)

回答

4

的findAll单元测试期间不嘲笑,这就是为什么你的代码不能正常工作。在运行测试之前,您需要手动添加一个模拟调用(mockFor可以帮助你)。这适用于如果您使用HQL或Criterias(我会建议使用纯HQL)。

或者,您可以使用动态查找器来解决您的问题。当您在单元测试中调用mockDomain(Something)时,动态查找程序和其他动态ORM方法(save,get,count,..)在大多数(?)情况下被模拟。它们通常比HQL(imho)更易于使用。

更新: 感谢Fletch指出并非所有动态发现者都被嘲笑。一个不会被嘲笑的动态查找器的例子是:Something.findAllWhereSomeNumberInList([1, 2, 3])

的你在你的代码中使用HQL可以改写像这样使用动态查找器:

Something.findBySomeNumberLike(searchString) 
+0

伟大而快速的答案。非常感谢你! – hering 2010-09-21 08:45:42

+1

好的答案,除了“在单元测试中调用mockDomain(Something)时,动态查找器和其他动态ORM方法(保存,获取,计数,..)都被嘲笑”并不完全正确。其中一些方法也缺失,例如FindAllWhereSomeNumberInList。 – Fletch 2010-09-21 08:58:52

+0

谢谢Fletch,我不知道那是真的。我会更新答案以反思这一点。你知道是否有任何有效的清单,哪些不清楚?对于hering:很高兴能够有所帮助:)我知道在使用新框架时能够找到所需的全部信息是多么困难。 – xlson 2010-09-21 10:30:35

2

Xlson的答案是正确的,但还存在另一种“前沿”的解决方案,你可以试试,这是目前在测试状态。见http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html

+0

我没有意识到这一点,将检查出来。谢谢你的提示! – xlson 2010-09-21 10:44:46

+0

我试过了,但无法使其正常工作。很多依赖没有解决。我试图用一个简单的查询和一些排序和分页来测试一个findAll的服务。真可惜,这是不可能测试:( – hering 2010-09-21 11:49:51

相关问题