【问题标题】:Using both mock and fake objects in junit testing在junit测试中同时使用mock和fake对象
【发布时间】:2016-04-16 05:31:01
【问题描述】:

在单元测试代码中同时使用模拟对象和假对象可以吗?

例子

when(computationHelper.someMethod()).thenReturn(stringGrid.writeCell(rowNum,colNum,value));

其中的computationHelper 是模拟对象,而stringGrid 是我自己的实现和一个假对象。

【问题讨论】:

  • 这很好,但是模拟的整个想法是将组件从类依赖链中隔离出来,因此将假对象与其耦合似乎不正确
  • 没有禁止它的规则。我会确保我的模拟对象在变量名中有mock

标签: java unit-testing mocking mockito


【解决方案1】:

是的,绝对允许在同一个测试中使用各种test doubles,包括模拟、伪造和存根。正如 cmets 中提到的 ndrone 一样,您可能希望选择一个命名系统或约定来帮助您识别哪些依赖项是 mock 或 fake,尤其是为了更容易帮助诊断测试是否由于缺少 mock 而失败预期或由于实际的系统故障。

您也可以考虑使用真正的实现;毕竟,隔离您的被测单元的决定可能会过分,因为人们希望您可以信任 JRE 的实现或 Mockito 的实现,并且您不应该试图模拟或替换它们。当它们快速、确定性和经过良好测试时,我倾向于使用真正的实现——并且当它们足够简单而不需要深度依赖图本身时。 (这需要一些判断;例如,我很想使用真正的 EmailAddressParser,但可能不是真正的 FullStackRpcServer。)


但请注意:您可能希望将返回值提取到变量中。

Result result = stringGrid.writeCell(rowNum,colNum,value);
when(computationHelper.someMethod()).thenReturn(someMethodResult);

这有两个原因:

  1. 对于 Mockito 的新手,您的原始语法可能看起来像每次调用 someMethod 时都会调用 writeCell,但实际上除非您编写自己的答案,否则不会发生这种情况。将其提取到一个变量中可以清楚地表明,当您设置 when 语句时,Mockito 将只计算一次 writeCell

  2. 虽然您的语法在使用假实现或真实实现时都能正常工作,但如果 stringGrid 是模拟的,类似的代码可能无法工作。这是因为Mockito relies heavily on side-effects and execution order,因此在存根方法的过程中调用模拟可能会导致难以诊断的异常。通常,确保对 whenverify 的调用中的每个参数都是局部变量、常量或文字(可能在 Mockito 匹配器中,如果适用)会更安全;在这里提取更容易遵守该规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多