3

Grails 1.3.5 で Service の Spock Spec (単体テスト) を作成していますが、次のエラーが発生しました。

No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]] Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)

groovy.lang.MissingMethodException: No signature of method: myapp.Thing.findAll() is applicable for argument types: (java.util.LinkedHashMap) values: [[sort:index, order:asc]]
Possible solutions: findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure), getAll(java.util.List), getAll([Ljava.lang.Object;)
    at grails.test.MockUtils.addDynamicFinders_closure56(MockUtils.groovy:641)
    at myapp.MyService.getCards(MyService.groovy:8)
    at myapp.MyServiceSpec.getCards returns empty map if no cards or statuses are available(MyServiceSpec.groovy:13)

以前はこのテストに合格していましたが、メソッドに結果の並べ替えを含めるようにサービスを変更したときにエラーが発生しましたgetThings()

class MyService {
    static transactional = true

    static getThings() {
        Thing.findAll(sort: 'index', order: 'asc')
    }
}

これは、アプリケーションの実行時にはまだ機能しているように見えるので、mockDomain().

class MyServiceSpec extends UnitSpec {
    def 'mockDomain has some limits, i suspect'() {
        given:
            mockDomain(Thing)
            def myService = new MyService()
        when:
            myService.getThings()
        then:
            true
    }
}

mockDomain()だから私の質問は、実行時に実際のドメインクラスを使用するのではなく、ドメインクラスに追加されるメソッドの違いですか? もしそうなら、それらは何ですか?

4

2 に答える 2

3

sortおよびorderHibernate 基準パラメータであり、それらはMockDomain()機能しません。Hibernate は関係ありません。幸いなことに。

findAll()インスタンス配列を使用して、その署名を自分でモックできます- の 2 番目のパラメーターMockDomain()( EDITfindAll(Map) ) のように、これは の署名をオーバーライドしますThing:

List<Thing> thingInstances = []

void setUp() {
    mockDomain(Thing, thingInstances)

    Thing.metaClass.`static`.findAll = { Map m ->
        def result = thingInstances.sort{ it."${m.order}" }
        m.order == 'asc' ? result : result.reverse()
    }
}

(編集終了)

または、統合テストにすることもできます。その後、何年も実行されます。これはお勧めしません。

于 2010-12-15T14:22:24.370 に答える
1

ドメイン オブジェクトをモックするための新しいアプローチがあります: http://grails.1312388.n4.nabble.com/New-approach-to-mocking-domain-classes-in-Grails-unit-tests-td2529895.html。多分これはここであなたを助けます。

于 2010-12-15T15:03:30.073 に答える