简体   繁体   English

grails单元测试中的grailsApplication访问

[英]grailsApplication access in Grails unit Test

I am trying to write unit tests for a service which use grailsApplication.config to do some settings. 我正在尝试为使用grailsApplication.config进行某些设置的服务编写单元测试。 It seems that in my unit tests that service instance could not access the config file (null pointer) for its setting while it could access that setting when I run "run-app". 似乎在我的单元测试中,服务实例无法访问其设置的配置文件(空指针),而当我运行“run-app”时它可以访问该设置。 How could I configure the service to access grailsApplication service in my unit tests. 如何在单元测试中配置服务以访问grailsApplication服务。

class MapCloudMediaServerControllerTests {

    def grailsApplication

    @Before
    public void setUp(){
        grailsApplication.config= 
        '''
   video{
   location="C:\\tmp\\"  // or shared filesystem drive for a cluster

    yamdi{
        path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\yamdi"  
         }

    ffmpeg  {
        fileExtension = "flv"  // use flv or mp4
        conversionArgs = "-b 600k -r 24 -ar 22050 -ab 96k"
        path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\ffmpeg"
        makethumb = "-an -ss 00:00:03 -an -r 2 -vframes 1 -y -f mjpeg"
    }

    ffprobe {
        path="C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\ffprobe" 
        params=""
    }

    flowplayer {
        version = "3.1.2" 
    }

    swfobject {
        version = "" 

    qtfaststart {
        path= "C:\\FFmpeg\\ffmpeg-20121125-git-26c531c-win64-static\\bin\\qtfaststart" 
    } 
}   '''
    }

@Test
    void testMpegtoFlvConvertor() {

        log.info "In test Mpg to Flv Convertor function!"

        def controller=new MapCloudMediaServerController()
        assert controller!=null

        controller.videoService=new VideoService()  
        assert controller.videoService!=null

        log.info "Is the video service null? ${controller.videoService==null}"

        controller.videoService.grailsApplication=grailsApplication

        log.info "Is grailsApplication null? ${controller.videoService.grailsApplication==null}"

        //Very important part for simulating the HTTP request
        controller.metaClass.request = new MockMultipartHttpServletRequest()
        controller.request.contentType="video/mpg"
        controller.request.content= new File("..\\MapCloudMediaServer\\web-app\\videoclips\\sample3.mpg").getBytes()

        controller.mpegtoFlvConvertor()

        byte[] videoOut=IOUtils.toByteArray(controller.response.getOutputStream())
        def outputFile=new File("..\\MapCloudMediaServer\\web-app\\videoclips\\testsample3.flv")
        outputFile.append(videoOut) 
    }
}

If you use @TestFor Grails (2.0) already mock grailsApplication for you, just set your configs, but do not declare the grailsApplication. 如果您使用@TestFor Grails(2.0)已经为您模拟grailsApplication,只需设置您的配置,但不要声明grailsApplication。 Doing that overrides the mocked instance. 这样做会覆盖模拟的实例。

@TestFor(MyService)
class MyServiceTests {

  @Before
  public void setUp() {
    grailsApplication.config.something = "something"
  }

  @Test
  void testSomething() {
    MyService service = new MyService()
    service.grailsApplication = grailsApplication
    service.doSomething()
  }


}

EDIT : 编辑

You declared a String , to add to config you must parse this. 您声明了一个String ,要添加到配置,您必须解析它。 See here an example. 这里的例子。

Basically you use the ConfigSlurper().parse() to get a ConfigObject , and use grails.config.merge() to add the contents to the config. 基本上,您使用ConfigSlurper().parse()来获取ConfigObject ,并使用grails.config.merge()将内容添加到配置中。

Constructing grailsApp using DefaultGrailsApplication would work. 使用DefaultGrailsApplication构建grailsApp会起作用。

class ZazzercodeUnitTestCase extends GrailsUnitTestCase {
    def grailsApplication = new org.codehaus.groovy.grails.commons.DefaultGrailsApplication()
    def chortIndex= grailsApplication.config.zazzercode.chortIndex
}

Go to http://ilikeorangutans.github.io/2014/02/06/grails-2-testing-guide 请访问http://ilikeorangutans.github.io/2014/02/06/grails-2-testing-guide

Grails' config is usually accessed via an injected instance of GrailsApplication using the config property. 通常使用config属性通过注入的GrailsApplication实例访问Grails的配置。 Grails injects GrailsApplication into unit tests, so you can access it directly: Grails将GrailsApplication注入单元测试,因此您可以直接访问它:

@TestMixin(GrailsUnitTestMixin)
class MySpec extends Specification {        
    private static final String VALUE = "Hello"
    void "test something with config"() {
        setup:
        // You have access to grailsApplication.config so you can 
        //modify these values as much as you need, so you can do
        grailsApplication.config.myConfigValue = VALUE

        assert:             
        grailsApplication.config.myConfigValue == VALUE
    }

}

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

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