繁体   English   中英

模拟 Grails 单元测试的方法

[英]Mock a method for Grails Unit Test

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

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

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

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

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

首先用 mockFor() 方法替换 new MockFor() class 实例化。 然后您需要将模拟服务注入 controller。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM