模拟Grails单元测试的方法

时间:2011-07-20 18:40:12

标签: unit-testing grails controller mocking

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

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而不是调用控制器中的实际方法?

1 个答案:

答案 0 :(得分:1)

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

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

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

通过执行上述操作,只会调用icfList()和getAllIC()的模拟版本,因此您根本不使用servletContext。有关详细信息,请查看Grails testing documentation