我想为我的类(class)编写 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, orcleanupSpec
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/