1

以下のコード。obj.&method を使用して参照を渡したいと思います。ただし、それをテストしようとすると、モックは機能しません。テストを機能させるためにできることはありますか?

テストを実行した結果、「should not get here」という例外がスローされます。

import grails.test.mixin.TestFor

@TestFor(SomeController)
class SomeControllerTest {
    void testSomething() {
        def control = mockFor(SomethingElse)
        control.demand.someMethod(1) { int num, String str, Map another, List param ->
            println 'worked'
        }
        controller.obj = control.createMock()

        controller.underTest()

        control.verify()
    }
}

class SomeController {
    SomethingElse obj

    void underTest() {
        otherCall(obj.&someMethod) // **
    }

    void otherCall(toRun) {
        String result = toRun(1, 'blah', null, null) // ** doesn't call mock here
    }
}

class SomethingElse {
    String someMethod(int num, String str, Map another, List param) {
        throw new RuntimeException('should not get here')
    }
}
4

1 に答える 1

1

はい、からかわないでくださいSomethingElseExpandoMetaClass代わりに使用してください。

void testSomething() {
    SomethingElse.metaClass.someMethod = {int num, String str, Map another, 
                                             List param ->
        println 'worked'
    }

    controller.obj = new SomethingElse()

    controller.underTest()
}

モック コントロールを失うという代償を伴います。

迂回する方法はotherCall()、同様にモックすることです

void testSomething() {
    def control = mockFor(SomethingElse)
    control.demand.someMethod(1) { int num, String str, Map another, 
                                        List param ->
        println 'worked'
    }

    def obj = control.createMock()

    controller.metaClass.otherCall = {Closure clos -> 
        delegate.obj.someMethod(1, 'blah', null, null)
    }

    controller.obj = obj
    controller.underTest()
    control.verify()
}

このようにして、モック コントロールを検証できます。MethodClosureしかし、私はまだモック オブジェクトを一緒に使用することに懐疑的です。

于 2013-10-01T22:07:28.767 に答える