1

我正在尝试在“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——这使得表格语法非常方便。

4

1 回答 1

3

您可以将该方法重构为:

...
inj1.someMethod() >> [mocked] * numReturned
...
then:
numCalled * inj2.someOtherMethod()

where:
numReturned | numCalled
1           | 0
2           | 1

换句话说,指定(仅) where 块中的部分并将它们组装到方法体中。这是一个常见的解决方案。

通常,另一种解决方案是将要在 where 块中使用的对象洗牌到@Shared字段中。“范围太大”的问题可以通过在同一个文件中包含多个小规范来缓解。但是,此解决方案不适用于模拟,因为模拟不能是@Shared.

于 2012-01-25T02:00:24.140 回答