Grails:没有方法签名,findAll()适用于参数类型:String,ArrayList

时间:2010-09-21 08:01:36

标签: grails groovy gorm findall

我是grails的新手并收到以下错误:
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%]]"

运行test-app时发生错误。它发生在以下地方:

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)

2 个答案:

答案 0 :(得分:4)

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

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

<强>更新 感谢Fletch指出并非所有动态查找器都被嘲笑。不会被模拟的动态查找器的示例是:Something.findAllWhereSomeNumberInList([1, 2, 3])

您在代码中使用的HQL可以使用动态查找器重写:

Something.findBySomeNumberLike(searchString)

答案 1 :(得分:2)

Xlson的回答是正确的,但是你可以尝试一种替代的“尖端”解决方案,目前处于测试状态。见http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html