Groovy Spock、PowerMockito和静态字段

Groovy Spock、PowerMockito和静态字段,groovy,spock,rule,powermockito,Groovy,Spock,Rule,Powermockito,我正试图用我在setupSpec()中定义的静态字段(作为预期输出)编写一个spock测试。我还想在此方法中设置模拟和预期的返回值 所以我从这样的事情开始: package spocktest import org.junit.ClassRule import org.junit.Rule import org.powermock.api.mockito.PowerMockito import org.powermock.core.classloader.annotations.Prepare

我正试图用我在
setupSpec()
中定义的静态字段(作为预期输出)编写一个spock测试。我还想在此方法中设置模拟和预期的返回值

所以我从这样的事情开始:

package spocktest

import org.junit.ClassRule
import org.junit.Rule
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import spock.lang.Shared

@PrepareForTest(StaticFoo)
class StaticInitTest extends spock.lang.Specification {
    @Rule PowerMockRule instanceRule = new PowerMockRule();

    @Shared static Foo FOO1

    def setupSpec() {
        FOO1 = Stub(Foo)

        PowerMockito.spy(StaticFoo)
        PowerMockito.doReturn(true).when(StaticFoo, "x")
    }

    def "test1"() {
        given:
        when:
        def x = StaticFoo.x()
        then:
        println FOO1
        x
    }

    class Foo {}

    class StaticFoo {
        static boolean x() { false }
    }
}
这有两个问题:
FOO1
为空,
x
为假(因此PowerMockito没有拦截)


然后我换了衣服

@Rule PowerMockRule instanceRule = new PowerMockRule();

现在
FOO1
setupSpec()
中定义的存根,但是
x
仍然是false(同样,PowerMockito不起作用)


仍然拥有
@ClassRule
,我搬家了

PowerMockito.spy(StaticFoo)
PowerMockito.doReturn(true).when(StaticFoo, "x")
进入
when:
块,该块也不起作用。
x
再次为假


我将
@ClassRule
改回
@Rule
,PowerMockito最终在
when:
块中定义行为时工作

x
为true,但
FOO1
为null


当我同时定义
@ClassRule
@Rule
时,似乎只有
@Rule
处于活动状态(
FOO1
为空,
x
为真)

显然,我可以让一个或另一个工作


现在,我有两个问题:

  • 如何使用静态字段和PowerMockito?我错过了什么
  • 是否可以在实际测试之外的setupSpec()方法(或任何其他)中设置预期返回值
使用的版本:

+- junit:junit:jar:4.11:test
|  \- org.hamcrest:hamcrest-core:jar:1.3:test
+- org.mockito:mockito-all:jar:1.9.5:test
+- org.spockframework:spock-core:jar:1.0-groovy-2.4:test
|  \- org.codehaus.groovy:groovy-all:jar:2.4.4:test
+- cglib:cglib-nodep:jar:2.2.2:test
+- org.objenesis:objenesis:jar:2.1:test
+- com.athaydes:spock-reports:jar:1.2.7:test
+- org.powermock:powermock-module-junit4:jar:1.5.3:test
|  \- org.powermock:powermock-module-junit4-common:jar:1.5.3:test
|     \- org.powermock:powermock-reflect:jar:1.5.3:test
+- org.powermock:powermock-api-mockito:jar:1.5.3:test
|  \- org.powermock:powermock-api-support:jar:1.5.3:test
+- org.powermock:powermock-module-junit4-rule:jar:1.5.1:test
|  +- org.powermock:powermock-classloading-base:jar:1.5.1:test
|  \- org.powermock:powermock-core:jar:1.5.1:test
\- org.powermock:powermock-classloading-xstream:jar:1.5.1:test

为什么要使用PowerMock?与Spock的mock和Spies相比,它给了您什么?在现有Java类中模拟静态方法的能力,另请参阅这可能会有所帮助:为什么要使用PowerMock?与Spock的mock和Spies相比,它给了您什么?在现有Java类中模拟静态方法的能力,另请参见以下内容:
+- junit:junit:jar:4.11:test
|  \- org.hamcrest:hamcrest-core:jar:1.3:test
+- org.mockito:mockito-all:jar:1.9.5:test
+- org.spockframework:spock-core:jar:1.0-groovy-2.4:test
|  \- org.codehaus.groovy:groovy-all:jar:2.4.4:test
+- cglib:cglib-nodep:jar:2.2.2:test
+- org.objenesis:objenesis:jar:2.1:test
+- com.athaydes:spock-reports:jar:1.2.7:test
+- org.powermock:powermock-module-junit4:jar:1.5.3:test
|  \- org.powermock:powermock-module-junit4-common:jar:1.5.3:test
|     \- org.powermock:powermock-reflect:jar:1.5.3:test
+- org.powermock:powermock-api-mockito:jar:1.5.3:test
|  \- org.powermock:powermock-api-support:jar:1.5.3:test
+- org.powermock:powermock-module-junit4-rule:jar:1.5.1:test
|  +- org.powermock:powermock-classloading-base:jar:1.5.1:test
|  \- org.powermock:powermock-core:jar:1.5.1:test
\- org.powermock:powermock-classloading-xstream:jar:1.5.1:test