Я пытаюсь написать тест spock со статическими полями (как и ожидалось), которые я определяю в setupSpec()
. Я также хочу настроить свои макеты и ожидаемые возвращаемые значения в этом методе.
Итак, я начал примерно так:
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
равно null и x
ложно (поэтому PowerMockito не перехватывает)
Затем я изменил
@Rule PowerMockRule instanceRule = new PowerMockRule();
to
@ClassRule static PowerMockRule rule = new PowerMockRule();
Теперь FOO1
- это заглушка, определенная в setupSpec()
, но x
все еще ложна (опять же, PowerMockito не работал)
Все еще имея @ClassRule
, я переехал
PowerMockito.spy(StaticFoo)
PowerMockito.doReturn(true).when(StaticFoo, "x")
в when:
block, что тоже не сработало. И снова x
было ложным.
Я изменил @ClassRule
обратно на @Rule
, и PowerMockito наконец заработал при определении поведения в блоке when:
x
верно, но FOO1
равно нулю
Когда я определяю как @ClassRule
, так и @Rule
, активным кажется только @Rule
(FOO1
имеет значение null, 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