我想为我的班级编写2个测试用例:
使用常规方法调用进行测试
使用抛出RuntimeException
为此,我创建了以下测试。但不幸的是,它并没有起作用:它以#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没有财产“好”而没有成功。或者"坏"。
答案 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()
}