【问题标题】:Grails: No signature of method findAll() is applicable for argument types: String, ArrayListGrails:方法 findAll() 的签名不适用于参数类型:String、ArrayList
【发布时间】:2010-09-21 08:01:36
【问题描述】:

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

【问题讨论】:

    标签: grails groovy grails-orm findall


    【解决方案1】:

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

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

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

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

    Something.findBySomeNumberLike(searchString)
    

    【讨论】:

    • 出色而快速的答案。非常感谢!
    • 很好的答案,除了“当您在单元测试中调用 mockDomain(Something) 时,动态查找器和其他动态 ORM 方法(保存、获取、计数、..)都被模拟了”并不完全正确.其中一些方法也丢失了,例如 FindAllWhereSomeNumberInList。
    • 谢谢 Fletch,我不知道是这样的。我会更新答案以反映这一点。您知道是否有任何有效的清单,哪些有效,哪些无效? To hering:很高兴能提供帮助 :) 我知道在使用新框架时找到所需的所有信息是多么困难。
    【解决方案2】:

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

    【讨论】:

    • 我不知道,会检查一下。感谢您的提示!
    • 我试过了,但无法让它工作。很多依赖没有解决。我正在尝试测试一个具有 findAll 的服务,该服务带有一个简单的查询以及一些排序和分页。无法测试这真是太可惜了:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多