2013-10-22 71 views
2
RunWith(PowerMockRunner.class) 
@PrepareForTest(StaticCallInvoke.class) 
@ContextConfiguration(locations = "file:test/spring/Beans.xml") 
class TestClass extends Specification{ 
@Test 
    def "Testing staticMocking"() { 


     setup: 
     def someObject=new SomeObject(); 
     someObject.someValue=100 
     PowerMockito.mockStatic(StaticCallInvoke.class) 

     when: 
     ClassUnderTest.executeSomething(someObject) 

     then: 
     someObject.someValue=110 /*Wrong Value,It says assertion failed. Thats absolutely fine becuase the value should be 100*/ 

    } 
} 

当我尝试将其更改为正确的值,即100,它抛出此异常,斯波克行为古怪

java.lang.NullPointerException: Cannot invoke method leaveScope() on null object 
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:32) 
    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:112) 
    at com.cognizant.awcoe.gamification.rules.helper.executors.RuleExecTest.$spock_feature_0_0(RuleExecTest.groovy:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 
    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)) 

如果我改回100,这一切都再好的(但断言失败)

以上测试使用PowerMock 1.5,Spock-0.6 for groovy 1.8来运行。 不确定这里发生了什么事。

任何帮助是非常赞赏:)

回答

2

貌似PowerMock是安装了自己的JUnit运行,覆盖Spock的一个。换句话说,Spock不再负责执行这个测试,PowerMock显然不能正确执行它。也许PowerMock不支持自定义的JUnit跑步者,在这种情况下,它不适用于Spock。

+0

感谢您的回复。除了powermock(也许,Jmockito?)之外的任何建议都可以解决我的问题吗?或者是代码重新编写更好的方法? – Avinash

+1

还没有看过这么多,但并没有Spock有它自己的嘲弄功能(哇,听起来:P) – justin

+0

现在你已经编辑你的问题,它表明你正在应用'RunWith(PowerMockRunner.class)你自己。这将无法正常工作,因为它会覆盖Spock的跑步者。据我所知,'PowerMockRunner'不是强制性的,因此我建议不要这样做。 –

1

如果做得对,Spock和PowerMock很好地协作,请参阅我的回购https://github.com/kriegaex/Spock_PowerMock。您需要做类似

@PrepareForTest([StaticCallInvoke.class]) 
@ContextConfiguration(locations = "file:test/spring/Beans.xml") 
class TestClass extends Specification { 
    @Rule PowerMockRule rule = new PowerMockRule(); 

    def "Testing staticMocking"() { 
     // ... 
    } 
} 
+1

尝试执行此示例时出现以下错误。唯一的补充是,我使用的是RoboSputnik跑步者。 com.thoughtworks.xstream.converters.ConversionException:无法调用org.apache.tools.ant.Project $ AntRefTable.writeObject():org/fusesource/jansi/Ansi ----调试信息---- 消息:无法调用org.apache.tools.ant.Project $ AntRefTable.writeObject() cause-exception:java.lang.NoClassDefFoundError cause-message:org/fusesource/jansi/Ansi – BenDroid