我是 grails 新手,收到以下错误:
没有方法签名:Something.findAll() 适用于参数类型:(java.lang.String, java.util.ArrayList) 值:[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)
最佳答案
findAll 在单元测试期间不会被模拟,这就是您的代码无法工作的原因。在运行测试之前,您需要手动添加调用的模拟(mockFor 可以帮助您)。如果您使用 HQL 或 Criterias(我建议使用 HQL,而不是纯 HQL),则这适用。
或者,您也可以使用动态查找器来解决问题。当您在单元测试中调用 mockDomain(Something)
时,动态查找器和其他动态 ORM 方法(save、get、count 等)在大多数(?)情况下都会被模拟。它们通常也比 HQL 更容易使用(恕我直言)。
更新:
感谢 Fletch 指出并非所有动态查找器都被 mock 。不会被模拟的动态查找器的示例如下:Something.findAllWhereSomeNumberInList([1, 2, 3])
。
您在代码中使用的 HQL 可以使用动态查找器重写如下:
Something.findBySomeNumberLike(searchString)
关于Grails:方法 findAll() 的签名不适用于参数类型:String、ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758347/