2012-12-12 81 views
9

我想爲使用grailsApplication.config做一些設置的服務編寫單元測試。看起來在我的單元測試中,服務實例無法訪問配置文件(空指針)的設置,而當我運行「run-app」時它可以訪問該設置。我如何配置服務以在單元測試中訪問grailsApplication服務。Grails在Grails中的應用程序訪問單元測試

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

你有TestFor或在本次測試的任何註釋?不要重新聲明grailsApplication,模擬附帶註釋。請參閱'GrailsUnitTestMixin'。 –

+0

是的它有@TestFor註釋。我刪除了「def grailsApplication」,但在grailsApplication對象上得到了消息null。順便說一句,我正在使用Grail 2.1。 – Reza

+0

你可以發佈堆棧跟蹤嗎?另外,我不確定你可以像這樣聲明配置,因爲它是ConfigObject的一個實例。我會做一個測試,看看你是否需要使用ConfigSlurper。 –

回答

19

如果使用@TestFor Grails的(2.0)已經爲你模擬grailsApplication,只需設置你的configs,但不申報grailsApplication。這樣做會覆蓋模擬的實例。

@TestFor(MyService) 
class MyServiceTests { 

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

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


} 

編輯

你宣佈String,添加到配置您必須分析這個。見here一個例子。

基本上你使用ConfigSlurper().parse()得到一個ConfigObject,並使用grails.config.merge()將內容添加到配置。

+0

我之前做過服務單元測試,並且正在運行。現在我在控制器中使用該服務。我想測試使用該服務的控制器。似乎我無法設置grailsApplication(用於服務)來測試控制器功能。有什麼建議麼? – Reza

+0

只需創建像這個例子一樣的服務,並直接在你的控制器實例中設置。 –

+0

我按照您提到的方式做了同樣的事情,但收到了消息「無法在空對象上設置屬性'配置'」。 – Reza

4

構建grailsApp使用DefaultGrailsApplication將工作。

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

轉到http://ilikeorangutans.github.io/2014/02/06/grails-2-testing-guide

Grails的配置通常通過使用config屬性 GrailsApplication的注入的實例訪問。 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 
    } 

}