2012-08-22 129 views
1

我有一個java類,我已經加入到我的resources.groovy這樣的:如何在Grails單元測試中模擬一個java類?

import persistentrep.ReasoningXMLLoader; 
// Place your Spring DSL code here 
beans = { 
reasoningXMLLoader(ReasoningXMLLoader) 
} 

然後我在我的GrailsS​​ervice使用這個類:

class XMLService 
{ 
def reasoningXMLLoader 

    def someMethod() 
    { 
     reasoningXMLLoader.doSomething() 
    } 
} 

很顯然,我想寫一個單元測試嘲笑推理XMLLoader並將其注入到服務中。 我嘗試使用@Mock,MockFor和mockFor,並且我總是收到org.codehaus.groovy.grails.exceptions.GrailsConfigurationException:無法添加Domain class [class persistentrep.ReasoningXMLLoader]。這不是一個域!錯誤:

org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Domain class [class persistentrep.ReasoningXMLLoader]. It is not a Domain! 
at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:916) 
at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:615) 
at org.codehaus.groovy.grails.commons.GrailsApplication$addArtefact.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) 
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:131) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:226) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145) 
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:128) 
at com.vpundit.www.XMLServiceTests.mockDomain(XMLServiceTests.groovy) 
at com.vpundit.www.XMLServiceTests.setUp(XMLServiceTests.groovy) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

有沒有一種方法來模擬這種使用內置的嘲諷框架Grails的,或者我需要使用類似的Mockito?

注入模擬的最佳方法是什麼?是否有一些Grails魔術可以爲我做,或者我只是使用暴露的屬性 - service.reasoningXMLLoader =模擬?

+0

您是否需要測試服務本身(XMLService)或ReasoningXMLLoader? –

+0

@Tom Metz服務本身,這就是爲什麼我試圖嘲笑裝載機。 –

+0

我希望,這可以幫助你:http://naleid.com/blog/2011/03/07/creating-new-instances-of-spring-singleton-beans-with-grails-beanbuilder/ –

回答

3

我終於設法弄清楚如何做到這一點。我得到了這個異常,因爲我試圖使用@Mock()屬性,這顯然不能用於我正在嘗試做的事情。

的任務實際上是閱讀Groovy的文件,以便closuresMockFor嘲諷後非常直截了當。我應該早一點認識到,Groovy的文檔更適合於這種類型的信息,Grails'

因此,這裏是如何使用閉包完成我想要做的事情。這是非常整齊的實際上是:

void testParseXml() { 
    String xml = "test string" 
    def mockReturnObject = {create your object to be returned here} 
    def loader = [parseString:{ mockReturnObject }] as ReasoningXMLLoader 
    service.reasoningXMLLoader = loader 
    def result = service.parseXML(xml) 
    do assertions here 
} 

這裏是如何做同樣的嘲笑:

void testParseXml() { 
    String xml = "test string" 
    def mockReturnObject = {create your object to be returned here} 
    def loader = new MockFor(ReasoningXMLLoader) 
    loader.demand.parseString{mockReturnObject} 
    service.reasoningXMLLoader = loader.proxyInstance() 
    def result = service.parseXML(xml) 
    do assertions here 
} 

我希望這可以幫助別人誰是新來的Grails和Groovy。

相關問題