Spock:在“where”子句表中使用Mock?

时间:2012-01-25 01:24:37

标签: java mocking spock

我试图在“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有影响的其他列 - 这使得表格语法非常方便。

1 个答案:

答案 0 :(得分:2)

您可以将方法重构为:

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

where:
numReturned | numCalled
1           | 0
2           | 1

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

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