Reza
Reza

Reputation: 739

grailsApplication access in Grails unit Test

I am trying to write unit tests for a service which use grailsApplication.config to do some settings. 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". How could I configure the service to access grailsApplication service in my unit tests.

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

Upvotes: 11

Views: 10938

Answers (3)

eHayik
eHayik

Reputation: 3262

Go to 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. Grails injects GrailsApplication into unit tests, so you can access it directly:

@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
    }

}

Upvotes: 1

prayagupadhyay
prayagupadhyay

Reputation: 31222

Constructing grailsApp using DefaultGrailsApplication would work.

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

Upvotes: 5

user800014
user800014

Reputation:

If you use @TestFor Grails (2.0) already mock grailsApplication for you, just set your configs, but do not declare the 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. 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.

Upvotes: 19

Related Questions