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"?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage