Groovy 斯波克行为古怪

Groovy 斯波克行为古怪,groovy,powermock,spock,Groovy,Powermock,Spock,当我尝试将其更改为正确的值,即100时,它会引发此异常 RunWith(PowerMockRunner.class) @PrepareForTest(StaticCallInvoke.class) @ContextConfiguration(locations = "file:test/spring/Beans.xml") class TestClass extends Specification{ @Test def "Testing staticMocking"() {

当我尝试将其更改为正确的值,即100时,它会引发此异常

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,一切又都好了(但是断言失败了)

上面的测试是使用PowerMock 1.5运行的,Spock-0.6用于groovy 1.8。 不知道这里发生了什么


非常感谢您的帮助:)

看起来PowerMock正在安装自己的JUnit runner,而不是Spock的。换句话说,Spock不再负责执行此测试,PowerMock显然无法正确执行它。也许PowerMock不支持自定义JUnit运行程序,在这种情况下,它将无法与Spock一起工作。

Spock和PowerMock配合得很好,如果操作正确,请参阅我的报告。你需要像这样做

@PrepareForTest([StaticCallInvoke.class])
@ContextConfiguration(locations=“file:test/spring/Beans.xml”)
类TestClass扩展了规范{
@Rule PowerMockRule Rule=新的PowerMockRule();
def“测试静态模拟”(){
// ...
}
}

感谢您的回复。除了powermock(也许是Jmockito?)之外,还有什么可以解决我问题的建议吗?或者代码重写是一种更好的方法吗?我还没有深入研究过这么多,但是斯波克没有自己的模拟功能(哇,听起来是:P)。现在你已经编辑了你的问题,它表明你正在应用
RunWith(PowerMockRunner.class)
你自己。这不会起作用,因为它会覆盖斯波克自己的跑步者。据我所知,
PowerMockRunner
不是强制性的,因此我建议不要使用它。我所能做的唯一相关补充是我正在使用RoboSputnik runner。com.thoughtworks.xstream.converters.ConversionException:无法调用org.apache.tools.ant.Project$AntRefTable.writeObject():org/fusesource/jansi/Ansi----调试信息----消息:无法调用org.apache.tools.ant.Project$AntRefTable.writeObject()原因异常:java.lang.NoClassDefFoundError原因消息:org/fusesource/jansi/Ansi
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) )