Spock Framework: Probleme mit Spionage
Ich habe ein Problem mit der Verwendung von Spy in Spock. Entweder funktioniert es nicht so, wie es sollte, oder ich verstehe es falsch, also versuche ich dies zu klären. Betrachten Sie diesen Code (Java):
public class CallingClass {
public String functionOne() {
//does stuff
return "one";
}
public String functionTwo() {
String one = functionOne();
return "some string " + one;
}
}
etzt möchte ich die Tatsache testen, dassfunctionTwo
AnrufefunctionOne
sowie den zurückgegebenen Wert von @ definierfunctionOne
(Stellen Sie sich zum Beispiel vor, wennfunctionOne
ist wirklich kompliziert und ich möchte es in meinem Test nicht ausführen, sondern nur stummschalten und so einstellen, dass ein bestimmter Wert zurückgegeben wird. Dazu schreibe ich folgenden Test in Groovy (mit 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"
}
}
Um solche Dinge zu tun, bittet Spock mich, das @ zu habcglib
library, also sieht meine Build-Datei (in Gradle) ungefähr so aus:
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'
}
enn ich jetzt den Test durchführe, erwarte ich dasfunctionOne
garnicht angerufen werden, sondern meine rausgestopfte version benutzen. Stattdessen erhalte ich Folgendes:
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)
Umso mehr, wenn ich dies debugge und einen Haltepunkt in @ setfunctionOne
es wird aufgerufen:
Was vermisse ich? Sollte mein Test nicht das Stubbed @ benutzefunctionOne
zur Verfügung gestellt und geben Sie einfach die Zeichenfolge"mocked function return"
?