【发布时间】:2013-04-05 01:09:29
【问题描述】:
第一次来到这里,如果我错过了什么,请道歉。 我希望使用 Spock 绕过对静态方法的调用。反馈会很棒
使用 groovy 模拟,我认为我可以通过静态调用,但没有找到它。 作为背景,我正在改造遗留 Java 中的测试。禁止重构。我正在使用 spock-0.7 和 groovy-1.8。
对静态方法的调用以这种形式与实例调用链接在一起:
public class ClassUnderTest{
public void methodUnderTest(Parameter param){
//everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
}
}
staticMethod 返回一个 ClassWithStatic 的实例 instanceMethod 返回方法其余部分所需的事物
如果我直接执行全局mock,它返回mocked实例ok:
def exerciseTheStaticMock(){
given:
def globalMock = GroovyMock(ClassWithStatic,global: true)
def instanceMock = Mock(ClassWithStatic)
when:
println(ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(testParam))
then:
interaction{
1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
1 * instanceMock.instanceMethod(_) >> returnThing
}
}
但是如果我从 ClassUnderTest 运行 methodUnderTest:
def failingAttemptToGetPastStatic(){
given:
def globalMock = GroovyMock(ClassWithStatic,global: true)
def instanceMock = Mock(ClassWithStatic)
ClassUnderTest myClassUnderTest = new ClassUnderTest()
when:
myClassUnderTest.methodUnderTest(testParam)
then:
interaction{
1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
1 * instanceMock.instanceMethod(_) >> returnThing
}
}
它抛出一个 ClassWithStatic 的真实实例,该实例在其 instanceMethod 中继续失败。
【问题讨论】:
-
如果对某人有帮助,我在 Spock 中使用 GroovyMock 来更改 Java 代码中的静态方法,但这会错误地影响其他测试。我使用这个注释来解决问题@ConfineMetaClassChanges
标签: unit-testing groovy spock powermock powermockito