Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在grails中对控制器执行单元测试时,无法使用grailsApplication.getMetadata.get(";)_Unit Testing_Grails_Junit4_Grails Controller - Fatal编程技术网

Unit testing 在grails中对控制器执行单元测试时,无法使用grailsApplication.getMetadata.get(";)

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

在我的grails应用程序中,在控制器中,我使用了以下类型的东西:

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。我尝试了您提供的解决方案,效果完全符合预期。非常感谢很高兴听到这有帮助:-)。如果可以,请将此问题标记为已回答-谢谢