gpt4 book ai didi

java - Spock:在 "where"子句表中使用 Mock?

转载 作者:行者123 更新时间:2023-11-30 04:54:24 26 4
gpt4 key购买 nike

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

最佳答案

您可以将该方法重构为:

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

where:
numReturned | numCalled
1 | 0
2 | 1

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

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

关于java - Spock:在 "where"子句表中使用 Mock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8996787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com