Спок, PowerMockito и статические поля

Я пытаюсь написать тест 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

person Sebastian Saip    schedule 25.05.2016    source источник
comment
Почему вы используете PowerMock? Что это дает тебе по сравнению с «Насмешками и шпионами» Спока?   -  person tim_yates    schedule 25.05.2016
comment
возможность имитировать статические методы в существующих классах Java, см. также этот ответ   -  person Sebastian Saip    schedule 25.05.2016
comment
это может помочь: github. com / kriegaex / Spock_PowerMock / blob / master / src / test / groovy /   -  person zack    schedule 04.08.2016