Prima volta qui, mi scuso se ho perso qualcosa. Spero di aggirare una chiamata a un metodo statico usando Spock. Il feedback sarebbe fantasticoMetodo statico simulato con GroovyMock o simile in Spock
Con groove di mock, ho pensato di riuscire a superare la chiamata statica ma non l'ho trovata. Per lo sfondo, sono in procinto di eseguire l'aggiornamento di test in legacy java. Il refactoring è proibito. Sto usando spock-0.7 con groovy-1.8.
La chiamata al metodo statico è concatenato con una chiamata esempio in questa forma:
public class ClassUnderTest{
public void methodUnderTest(Parameter param){
//everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
}
}
staticMethod restituisce un'istanza di ClassWithStatic instanceMethod restituisce la cosa necessaria nel resto del metodo
Se Eseguo direttamente il simulato globale, restituisce l'istanza derisa 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
}
}
Ma se eseguo il metho dUnderTest dal ClassUnderTest:
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
}
}
Si butta giù una vera e propria istanza di ClassWithStatic che continua a fallire nel suo instanceMethod.
Se aiuta qualcuno, sto usando GroovyMock in Spock per cambiare i metodi statici nel codice Java, ma questo ha influenzato in modo errato altri test. Ho usato questa annotazione per risolvere il problema @ConfineMetaClassChanges – Topera