初心者です、抜けてたらごめんなさい。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 を返します
グローバル モックを直接実行すると、モックされたインスタンスが正常に返されます。
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
}
}
instanceMethod で失敗する ClassWithStatic の実際のインスタンスをスローします。