java - Spock:如何将不同的实例传递给 where 子句并使调用计数起作用?

标签 java unit-testing spock

我想为我的类(class)编写 2 个测试用例:

  1. 使用正常方法调用进行测试

  2. 使用抛出 RuntimeException 的方法调用进行测试

为此,我创建了以下测试。但不幸的是它不起作用:它以“调用次数太少”结束,零而不是一。

为什么?

代码:

import spock.lang.Shared
import spock.lang.Specification

class SimpleSpockTest extends Specification {

    interface Simple {
        void run();
    }

    @Shared
    Simple good = Mock(Simple)

    @Shared
    Simple bad = Mock(Simple)

    def "test invocations"() {
        setup:
        bad.run() >> { throw new RuntimeException() }
        when:
        instance.run()
        then:
        invocations * instance.run()
        where:
        instance | invocations
        good     | 1
        bad      | 1

    }

}

PS 另外,我想将“共享”实例移动到固定“设置”,但我不能:它失败,并说类 SimpleSpockTest 没有属性“好”或“坏”。

最佳答案

模拟对象不会按照您希望的 @Shared 字段的方式运行。来自 Spock 的文档 Interaction Based Testing :

Interactions are always scoped to a particular feature method. Hence they cannot be declared in a static method, setupSpec method, or cleanupSpec method. Likewise, mock objects should not be stored in static or @Shared fields.

换句话说,您必须在功能方法本身内部定义模拟。

您提到上面提供的示例已简化,但如果可能的话,您必须执行如下操作:

def "test invocations"() {
    setup:
    Simple good = Mock(Simple)
    Simple bad = Mock(Simple)
    bad.run() >> { throw new RuntimeException() }

    when:
    good.run()
    bad.run()

    then:
    1 * good.run()
    1 * bad.run()
}

关于java - Spock:如何将不同的实例传递给 where 子句并使调用计数起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383974/

相关文章:

java - 如何在运行时设置 JTextField 的宽度?

java - Python 相当于 Java 的 statement.getGeneratedKeys()?

asp.net - Rhino Mocks 中的 NMocks2 参数语法?

angularjs - 测试正确的 $scope 初始化是否是 "testing someone else' 代码的示例”?

grails - grails创建 Controller junit测试而不是spock

groovy - 如何使用 Geb/Spock 向 Sauce Labs 报告结果?

grailsApplication Autowiring 到 spock 测试始终为 null

java - 数组赋值 vs. for 循环赋值

java - 命名约定 JUnit 后缀或前缀 Test

java - 从 Joda 的 LocalDate 获取月份和年份