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

Java 斯波克:我如何将不同的实例传递给where子句并使调用计数工作?,java,unit-testing,spock,Java,Unit Testing,Spock,我想为我的类编写两个测试用例: 使用普通方法调用进行测试 使用引发RuntimeException的方法调用进行测试 为此,我创建了以下测试。但不幸的是,它不起作用:它以“调用太少”而结束,零而不是一 为什么? 代码: PS 此外,我还想将“共享”实例移动到fixture“setup”中,但我不能这样做:它无法说明SimpleSpockTest类没有属性“good”或“bad”。模拟对象不会以您想要的方式作为@shared字段。根据斯波克关于以下方面的文件: 交互总是限定在特定功能方法的范围内。

我想为我的类编写两个测试用例:

  • 使用普通方法调用进行测试

  • 使用引发RuntimeException的方法调用进行测试

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

    为什么?

    代码:

    PS
    此外,我还想将“共享”实例移动到fixture“setup”中,但我不能这样做:它无法说明SimpleSpockTest类没有属性“good”或“bad”。

    模拟对象不会以您想要的方式作为
    @shared
    字段。根据斯波克关于以下方面的文件:

    交互总是限定在特定功能方法的范围内。因此,它们不能在静态方法、
    setupSpec
    方法或
    cleanupSpec
    方法中声明。同样,模拟对象不应存储在静态或
    @Shared
    字段中

    换句话说,您必须在feature方法本身内部定义mock

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

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

    模拟对象将不会以您想要的方式作为
    @Shared
    字段。根据斯波克关于以下方面的文件:

    交互总是限定在特定功能方法的范围内。因此,它们不能在静态方法、
    setupSpec
    方法或
    cleanupSpec
    方法中声明。同样,模拟对象不应存储在静态或
    @Shared
    字段中

    换句话说,您必须在feature方法本身内部定义mock

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

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

    看来这个测试毫无意义。你想达到什么目标?你的方案是什么?蛋白石,这只是一个简单的例子。在实际测试中,我想确保1)运行方法产生的异常被正确注册(这就是为什么我需要抛出异常的mock,我可以计算异常处理程序调用次数)2)运行方法被调用的次数正确。这个测试是一个简化的例子,但它不起作用。看起来这个测试毫无意义。你想达到什么目标?你的方案是什么?蛋白石,这只是一个简单的例子。在实际测试中,我想确保1)运行方法产生的异常被正确注册(这就是为什么我需要抛出异常的mock,我可以计算异常处理程序调用次数)2)运行方法被调用的次数正确。这个测试是一个简化的例子,但它不起作用。