【问题标题】:Spock block mocks and where to wire themSpock 块模拟和连接它们的位置
【发布时间】:2016-05-06 12:43:37
【问题描述】:

我见过 Spock 测试,其中模拟在 given 块中连接和配置(这对我来说最有意义),以及让测试通过的唯一方法需要我的情况在then 块内连接/配置模拟,这对我来说简直是愚蠢的。后者的一个例子是一个问题that I asked some time ago

所以我问:是什么决定了 在哪里 实际连接/配置模拟,无论是在 given 还是在 then 我真的希望答案是'不要只是“继续玩它直到它起作用”,因为这对我的小机器人大脑来说太不确定了。

【问题讨论】:

  • 你能改一下这个问题的标题,让它更押韵吗?
  • 这是故意的 :-)

标签: unit-testing groovy mocking spock


【解决方案1】:

如果您要在多个测试中使用 Mocks 和 Stub 并希望减少样板代码,则应在 setup/given 块或 setup() 方法中实例化它们。

在我看来,Mocks 和 Stubs 行为应该定义在范围最窄且有意义的地方。 then 通常是最有意义的,但是定义你并不真正关心仔细检查的一般行为可以放在 setup/given 块甚至 setup() 方法中。

【讨论】:

  • 感谢@Jon Peterson (+1) - 我(恭敬地)不同意 then 最有意义,但这是我现在不感兴趣的主观论点! 但是,正如上面提供的链接所展示的,在given 内连接/配置模拟时肯定会有用例根本不起作用。我的问题是是什么驱动了这个? 意思是,在given 中的接线/配置模拟在什么情况下可以工作,什么时候必须在then 中完成?再次感谢!
  • 在另一个问题中,我相信如果您在given 块中使用fizz1.getProperty('name') 而不是fizz1.name,它也会起作用。
  • 您对 Spock 的“反直觉”性质感到困惑的根源可能是您使用其他 Java 模拟框架的经验。 Spock 正在做一些事情,在 when 块之前调用 then 块中的期望。附加一个调试器,您将看到调用的顺序。当我使用非 Spock 模拟(例如 Camel MockEndpoints)时,我通常使用 expect 块而不是 when/then,因此我可以手动对期望进行排序。
  • 再次感谢@Jon Peterson(两者都+1)-现在我认为我们正在取得进展。那么,在我的另一个问题中,我是否也可以使用fizz1.getName() >> f1 使其在given 块中工作,或者我仍然需要像您已经建议的那样使用fizz1.getProperty('name')?如果fizz1.getName()没有起作用,那么为什么?我认为回答那个会帮助我理解所有这些。再次感谢!
  • 您在问题中定义的Fizz 类没有getName() 方法或name 字段(公共字段将在Groovy 中自动生成访问器方法)。因此,调用fizz.name 不是调用手动定义的getName() 或自动生成的,而是调用getProperty('name')(参见GroovyObject 文档)。如果您尝试调用getName(),则会引发 MethodNotFound 异常。由于此类问题,我不建议使用getProperty() 样式,而是专门定义将生成访问器的公共字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多