
[英]How to mock Shiro accessControl() method in grails unit test case
[英]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.