grailsApplication access in Grails unit Test

10,522

Solution 1

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
}

Solution 2

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
    }

}
Share:
10,522
Reza
Author by

Reza

I am an experimental computer scientist. I got my PhD in computer science from UC Irvine. I am interested in any challenging work in Data Engineering and Science, Service Oriented Architecture, System Modeling and Optimization.

Updated on July 23, 2022

Comments

  • Reza
    Reza almost 2 years

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