2

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

4

2 回答 2

4

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

或者,您可以使用动态查找器来解决您的问题。mockDomain(Something)当您在单元测试中调用时,动态查找器和其他动态 ORM 方法(保存、获取、计数、..)在大多数(?)情况下都会被模拟。它们通常也比 HQL 更容易使用(恕我直言)。

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

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

Something.findBySomeNumberLike(searchString)
于 2010-09-21T08:38:25.780 回答
2

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

于 2010-09-21T09:03:15.313 回答