【问题标题】:Mock a method for Grails Unit Test模拟 Grails 单元测试的方法
【发布时间】:2011-07-20 18:40:12
【问题描述】:

在我的一个单元测试中,我在执行模拟方法时遇到了一些困难。我有以下测试代码:

void testExample() {
    def mockICFService = new MockFor(ICFService)
    ...

    //Mock the methods
    controller.metaClass.icfList = { def person ->
        println "icfList"
        return [new IC(conceptId:'12345')]
    }
    mockICFService.demand.getAllIC(1..1) { def id, def withHist, def appId ->
        println "mocking service"
        return new Person()
    }
    ...

    def model = controller.detail()
}

在我的控制器类中,我通过 ICFService 的 getAllIC() 创建了一个 Person。这部分工作正常。然而,在函数的后面,有一个对 icfList 的调用(在控制器中定义)。通过 println,我确定调用仍在进行中,尽管它返回一个空数组。我相信这是因为数组是根据 servletContext 中的数据填充的,但在单元测试中无法访问它(因此我试图模拟它)。

有谁知道如何强制测试使用 controller.icfList 的模拟版本,而不是调用控制器中的实际方法?

【问题讨论】:

    标签: unit-testing grails controller mocking


    【解决方案1】:

    当我尝试您的代码时,让我感到震惊的是模拟服务,而正常工作的部分是模拟出来的 icfList() 方法。有趣的是,与您的观察相反。对于它的价值,这就是我所做的:

    首先用 mockFor() 方法替换新的 MockFor() 类实例化。然后你需要将模拟服务注入到控制器中。

    def mockICFService = mockFor(ICFService)
    controller.iCFService = mockICFService.createMock()
    

    通过执行上述操作,只有 icfList() 和 getAllIC() 的模拟版本被调用,因此您根本没有使用 servletContext。查看Grails testing documentation 了解更多信息。

    【讨论】:

    • 感谢乔丹的帮助!我确实设法通过使用您对 mockFor 的建议使其工作,并对我模拟 getICF() 的方式进行了一些小改动(主要是确保我在 PROPER 控制器中覆盖它......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多