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 よりもこちらをお勧めします)。

あるいは、動的ファインダーを使用して問題を解決できる可能性があります。動的ファインダーおよびその他の動的 ORM メソッド (save、get、count、..) は、ほとんど (?) の場合mockDomain(Something)、単体テストで呼び出すときにモックされます。また、一般的にHQLよりも使いやすいです(imho)。

更新: すべての動的ファインダーがモックされているわけではないことを指摘してくれた 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 に答える