【问题标题】:Spock: using a Mock inside a "where" clause table?Spock:在“where”子句表中使用 Mock?
【发布时间】:2012-01-25 01:24:36
【问题描述】:

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

【问题讨论】:

    标签: java mocking spock


    【解决方案1】:

    您可以将方法重构为:

    ...
    inj1.someMethod() >> [mocked] * numReturned
    ...
    then:
    numCalled * inj2.someOtherMethod()
    
    where:
    numReturned | numCalled
    1           | 0
    2           | 1
    

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

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

    【讨论】:

    • 我考虑过这样做,并且它适用于我的情况,但是如果这个列表必须更复杂(比如,混合不同的模拟对象,以不同的顺序等)怎么办?当然,作为解决方案的概括,您可以在“where”表中使用 int 并在“given”子句中切换以生成所需的模拟,但这有点违背了漂亮表语法的目的......
    • 每个工具都有其局限性。请随时通过issues.spockframework.org 提交功能请求。
    • Done :) 感谢您为 Spock @peter 所做的工作。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 2014-05-15
    • 2016-03-24
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多