java - 斯波克框架 : problems with spying

标签 java unit-testing groovy spock spock-spy

我对在 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 真的很复杂,我不想在我的测试中执行它只是想 stub 并设置它返回某个值)。为此,我在 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 根本不会被调用,而是使用我的 stub 版本。相反,我得到这个:

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 中设置断点,它会被调用 :(

我错过了什么?我的测试不应该使用提供的 stub 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"
    }
}

当你监视/模拟并验证这是应该如何指定返回值时。

关于java - 斯波克框架 : problems with spying,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875514/

相关文章:

java - 并行调用方法时的线程安全问题

django - Django 中的单元测试 - 在哪里划线?

ajax - grails和AJAX动态搜索

groovy - 这个Groovy表达式有什么问题?

java - 如何去除JCheckboxes后面的灰色背景?

Javadoc - 如何添加有关类的一般注释?

java - 比较字符串及其缩写的有效性

c# - C# Web api 中的最小起订量单元测试

unit-testing - Python撤销方法模拟

json - Grails JSON 数组