我试图在“where”子句的表中使用ia模拟对象。基本上是这样的:
def "my test"(){
given:
InjectedObject1 inj1 = Mock()
InjectedObject2 inj2 = Mock()
SystemUnderTest system = new System(inj1, inj2)
MockedObject mocked = Mock()
inj1.someMethod() >> list // this will be a list of MockedObject
when:
system.execute()
then:
n * inj2.someOtherMethod()
where:
list | n
[mocked] | 0
[mocked, mocked] | 1
}
这不起作用,因为“where”子句在“given”子句之前执行,因此mocked
在首次引用时尚不存在。我该如何克服这个问题? mocked
仅用于此测试,因此我想避免在此方法之外创建它。
请注意,这是一个简化的示例,实际上有更多的交互,以及表中对n
有影响的其他列 - 这使得表格语法非常方便。
答案 0 :(得分:2)
您可以将方法重构为:
...
inj1.someMethod() >> [mocked] * numReturned
...
then:
numCalled * inj2.someOtherMethod()
where:
numReturned | numCalled
1 | 0
2 | 1
换句话说,指定(仅)where-block中的部分并将它们组装在方法体中。这是一种常见的解决方案。
通常,另一种解决方案是将where-block中使用的对象混合到@Shared
字段中。通过在同一文件中包含多个小规格,可以减轻“太大的范围”问题。但是,此解决方案不适用于模拟,因为模拟不能是@Shared
。