Mock statische Methode mit GroovyMock oder ähnlichem in Spock

Ich entschuldige mich, wenn ich etwas verpasst habe. Ich hoffe, mit Spock einen Aufruf einer statischen Methode umgehen zu können. Feedback wäre toll

Mit groovigen Mocks dachte ich, ich könnte den statischen Anruf überwinden, habe ihn aber nicht gefunden. Als Hintergrund bin ich dabei, Tests in Legacy Java nachzurüsten. Refactoring ist verboten. Ich benutze spock-0.7 mit groovy-1.8.

Der Aufruf der statischen Methode ist mit einem Instanzaufruf in folgender Form verkettet:

public class ClassUnderTest{

public void methodUnderTest(Parameter param){
  //everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
   }

}

staticMethod gibt eine Instanz von ClassWithStatic zurück. instanceMethod gibt das Ding zurück, das für den Rest der Methode benötigt wird

Wenn ich das globale Mock direkt ausführe, gibt es die gespielte Instanz ok zurück:

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
    }
}

Aber wenn ich den methodUnderTest vom ClassUnderTest aus starte:

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
    }
}

Es löst eine reale Instanz von ClassWithStatic aus, die in ihrer instanceMethod fehlschlägt.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage