我在Spock中使用Spy时遇到问题,它要么不能正常工作,要么我的理解是错误的,所以我尝试对此进行澄清。
考虑以下代码(Java):

public class CallingClass {

    public String functionOne() {
        //does stuff
        return "one";
    }

    public String functionTwo() {
        String one = functionOne();
        return "some string " + one;
    }
}

现在,我想测试functionTwo调用functionOne并定义functionOne的返回值的事实(例如,想象一下functionOne确实很复杂,并且我不想在测试中执行它只是想将其存根并将其设置为返回某个值)。为此,我在Groovy中编写了以下测试(使用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"
    }
}

为了做这样的事情,Spock要求我拥有cglib库,所以我的构建文件(在Gradle中)如下所示:
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'

}

现在,当我运行测试时,我希望根本不调用functionOne,而是使用我的存根版本。相反,我得到这个:
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)

更重要的是,如果我调试它并在functionOne中设置一个断点,它将被称为:(

我想念什么?我的测试不应该使用提供的存根functionOne并仅返回字符串"mocked function return"吗?

最佳答案

它应该是:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class CallingClassTest extends Specification {

    def "check that functionTwo calls functionOne"() {
        def c = Spy(CallingClass)

        when:
        def s = c.functionTwo()

        then:
        1 * c.functionOne() >> "mocked function return"
        s == "some string mocked function return"
    }
}

public class CallingClass {

    public String functionOne() {
        "one"
    }

    public String functionTwo() {
        String one = functionOne()
        "some string $one"
    }
}

当您同时监视/验证并验证这是应如何指定返回值时。

09-03 18:58