【问题标题】:How to mock obj.&method in groovy/grails如何在 groovy/grails 中模拟 obj.&method
【发布时间】:2013-10-01 20:02:53
【问题描述】:

代码如下。我想使用 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')
    }
}

【问题讨论】:

    标签: unit-testing grails groovy mocking


    【解决方案1】:

    是的,不要嘲笑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 持怀疑态度。

    【讨论】:

    • 谢谢。我不想嘲笑 otherCall 因为那是正在测试的一部分。但是按照您的指示使用 metaClass 效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2018-02-08
    相关资源
    最近更新 更多