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

时间:2016-11-02 15:38:01

标签: java unit-testing spock

我想为我的班级编写2个测试用例:

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

  2. 使用抛出RuntimeException

  3. 的方法调用进行测试

    为此,我创建了以下测试。但不幸的是,它并没有起作用:它以#34;太少的调用而结束,而不是一个。

    为什么?

    代码:

    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没有财产“好”而没有成功。或者"坏"。

1 个答案:

答案 0 :(得分:0)

模拟对象不会以@Shared字段的方式运行。来自Spock关于Interaction Based Testing的文档:

  

交互始终作用于特定要素方法。因此,无法使用静态方法setupSpec方法或cleanupSpec方法声明它们。同样,模拟对象不应存储在静态或@Shared字段中。

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

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

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()
}