Spock Framework: problemas con el espionaje
Tengo un problema con el uso de Spy en Spock, o no funciona como debería o mi comprensión es incorrecta, así que estoy tratando de aclarar esto. Considere este código (Java):
public class CallingClass {
public String functionOne() {
//does stuff
return "one";
}
public String functionTwo() {
String one = functionOne();
return "some string " + one;
}
}
Ahora quiero probar el hecho de quefunctionTwo
llamadasfunctionOne
así como definir el valor devuelto desdefunctionOne
(imagine por ejemplo sifunctionOne
es realmente complicado y no quiero ejecutarlo en mi prueba, solo quiero tropezarlo y configurarlo para que devuelva un cierto valor). Para esto escribo la siguiente prueba en Groovy (usando Spock):
class CallingClassTest extends Specification {
def "check that functionTwo calls functionOne"() {
def c = Spy(CallingClass)
c.functionOne() >> "mocked function return"
when:
def s = c.functionTwo()
then:
1 * c.functionOne()
s == "some string mocked function return"
}
}
Para hacer cosas como esta, Spock me pide que tengacglib
biblioteca, por lo que mi archivo de compilación (en Gradle) se ve así:
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy:latest.release'
testCompile 'org.spockframework:spock-core:latest.release'
testCompile 'junit:junit:latest.release'
testCompile 'cglib:cglib-nodep:latest.release'
}
Ahora, cuando ejecuto la prueba, espero quefunctionOne
no ser llamado en absoluto, y en su lugar mi versión apagada para ser utilizada. En cambio, me sale esto:
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
Condition not satisfied:
s == "some string mocked function return"
| |
| false
| 19 differences (44% similarity)
| some string (-)o(-------)n(-------)e(----)
| some string (m)o(cked fu)n(ction r)e(turn)
some string one
at CallingClassTest.check that functionTwo calls functionOne(CallingClassTest.groovy:17)
Aún más, si depuro esto y establezco un punto de interrupción enfunctionOne
se llama :(
¿Qué me estoy perdiendo? ¿No debería mi prueba usar el trozofunctionOne
proporcionado y simplemente devolver la cadena"mocked function return"
?