I'm trying to write a spock test with static fields (as expected output) that I define in the setupSpec(). I also want to setup my mocks and the expected return values in this method.
So I started with something like this:
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 }
}
}
There are two problems with this:
FOO1 is null and x is false (so PowerMockito did not intercept)
I then changed
@Rule PowerMockRule instanceRule = new PowerMockRule();
to
@ClassRule static PowerMockRule rule = new PowerMockRule();
Now FOO1 is the Stub defined in setupSpec(), but x is still false (again, PowerMockito did not work)
Still having the @ClassRule, I moved
PowerMockito.spy(StaticFoo)
PowerMockito.doReturn(true).when(StaticFoo, "x")
into the when:block, which also did not work. Again x was false.
I changed @ClassRule back to @Rule and PowerMockito finally worked when defining behaviour in the when: block
x is true, but FOO1 is null
When I define both @ClassRule and @Rule, only the @Rule seems to be active (FOO1 is null, x is true)
Apparently, I can either have one or the other working.
Now, I have two questions:
- How can I use both static fields and PowerMockito? What am I missing?
- Is it possible to setup the expected return values in a setupSpec() (or any other) method outside the actual test?
Versions used:
+- 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