Unit testing 在grails中对控制器执行单元测试时,无法使用grailsApplication.getMetadata.get(";)
在我的grails应用程序中,在控制器中,我使用了以下类型的东西:Unit testing 在grails中对控制器执行单元测试时,无法使用grailsApplication.getMetadata.get(";),unit-testing,grails,junit4,grails-controller,Unit Testing,Grails,Junit4,Grails Controller,在我的grails应用程序中,在控制器中,我使用了以下类型的东西: class SampleController { def action1 = { def abc = grailsApplication.getMetadata().get("xyz") render abc.toString() } } 运行应用程序时,它会从application.properties中正确读取属性“xyz”,并且工作正常。但当我为上述控制器编写单元测试用例时,如下所示: c
class SampleController {
def action1 = {
def abc = grailsApplication.getMetadata().get("xyz")
render abc.toString()
}
}
运行应用程序时,它会从application.properties中正确读取属性“xyz”,并且工作正常。但当我为上述控制器编写单元测试用例时,如下所示:
class SampleControllerTests extends ControllerUnitTestCase {
SampleController controller
protected void setUp() {
super.setUp()
controller = new SampleController()
mockController(SampleController)
mockLogging(SampleController)
}
void testAction1() {
controller.action1()
assertEquals "abc", controller.response.contentAsString
}
}
但当我执行“grails测试应用程序”时,我希望它将从application.properties中获取属性“xyz”,并按预期返回。但它给出的错误是“没有这样的属性:grailsApplication”
我明白了,我想我需要模拟grailsApplication
对象,我也尝试了许多选项,但都不起作用
我是Grails新手。
mockController
不会模拟Grails应用程序,您需要自己模拟
最快的解决方案是:
protected void setUp() {
super.setUp()
mockLogging(DummyController)
GrailsApplication grailsApplication = new DefaultGrailsApplication()
controller.metaClass.getGrailsApplication = { -> grailsApplication }
}
此解决方案并不完美-它将在每次设置期间创建一个新的DefaultGrailsApplication
,并且mockController
还会创建一些额外的DefaultGrailsApplication
实例
注意,您不需要自己调用<代码> MOCKController < /C> >它将由<代码> ControlRunUnTestCase对您进行。
GRARES版本的WHECH版本您使用吗?版本:GRAIL1.3.7您可能想考虑将ABC的值注入到控制器中,这将使您的控制器从grailsApplication的显式依赖中解放出来。谢谢drorb。我尝试了您提供的解决方案,效果完全符合预期。非常感谢很高兴听到这有帮助:-)。如果可以,请将此问题标记为已回答-谢谢