Spock Framework: problemas com espionagem
Eu tenho um problema ao usar o Spy no Spock, ele não funciona como deveria ou meu entendimento está errado, por isso estou tentando esclarecer isso. 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;
}
}
Agora eu quero testar o fato de quefunctionTwo
chamadasfunctionOne
bem como definir o valor retornado defunctionOne
(imagine, por exemplo, sefunctionOne
é realmente complicado e não quero executá-lo no meu teste, apenas quero stub-lo e configurá-lo para retornar um determinado valor). Para isso, escrevo o seguinte teste no 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 fazer coisas assim, Spock está me pedindo para ter ocglib
biblioteca, então meu arquivo de compilação (em Gradle) é mais ou menos assim:
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'
}
Agora, quando executo o teste, espero que ofunctionOne
para não ser chamado de maneira alguma, e, em vez disso, minha versão stubada para ser usada. Em vez disso, recebo o seguinte:
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)
Ainda mais, se eu depurar isso e definir um ponto de interrupção nofunctionOne
é chamado :(
o que estou perdendo? Meu teste não deve usar o stubbedfunctionOne
fornecido e basta retornar a string"mocked function return"
?