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