我是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)
答案 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