簡體   English   中英

如何在Groovy / Grails中模擬obj。&method

[英]How to mock obj.&method in groovy/grails

下面的代碼。 我想使用obj。&method來傳遞對它的引用。 但是,在嘗試測試時,無法進行模擬。 我可以做一些測試來使其正常工作嗎?

運行測試的結果是它將引發異常“不應到達此處”。

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')
    }
}

是的,不要嘲笑SomethingElse 請改用ExpandoMetaClass

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一起使用持懷疑態度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM