初来乍到,如有遗漏,敬请见谅。我希望使用 Spock 绕过对静态方法的调用。反馈会很棒
使用 groovy 模拟,我认为我可以通过静态调用但没有找到它。作为背景,我正在改造遗留 Java 中的测试。禁止重构。我正在使用带有 groovy-1.8 的 spock-0.7。
对静态方法的调用与以下形式的实例调用链接在一起:
public class ClassUnderTest{
public void methodUnderTest(Parameter param){
//everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
}
}
staticMethod 返回 ClassWithStatic 的实例 instanceMethod 返回方法其余部分所需的 Thing
如果我直接执行全局模拟,它会返回模拟的实例 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 中继续失败。