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

Respuestas a la pregunta(1)

Su respuesta a la pregunta