18

初心者です、抜けてたらごめんなさい。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 の実際のインスタンスをスローします。

4

4 に答える 4

26

Spock は、Groovy で実装された静的メソッドのみをモックできます。Java で実装された静的メソッドをモック化するには、 GroovyMockPowerMock 、またはJMockitなどのツールを使用する必要があります。

PS: これらのツールが目標を達成するためにいくつかの深いトリックを引き出していることを考えると、Groovy/Spock (Java/JUnit ではなく) で実装されたテストとどのように連携するか、またどの程度うまく機能するかを知りたいと思います。

于 2013-04-05T12:28:28.287 に答える