嘲笑计划执行器服务与"Don't mock type you don't own"哲学



嘲笑计划ExecutorService确实会使我的课程更容易,但是根据Mockito的建议,这似乎是一个坏主意,因为模拟班级的逻辑可以以一种将其使用的方式改变以不正确的方式,但是单位测试仍会报告成功。

看来,编写包装器是"干净"的方式,但是我觉得这仅会导致界面的完全重复,这只会使我的代码不那么直接。我想遵循此答案的实际建议,但我不确定《计划》的合同始终保持不变。

我可以假设现有的计划executorService方法的合同(或更一般而言,JRE LIBS中的任何其他类)永远不会更改?如果不是,如果我在集成测试中测试正确使用它,同时仍直接在单元测试中对其进行嘲笑,这足够了吗?

它更多的是指南而不是规则。做可能会导致干净,可靠和非脆性测试的事情。如您所引用的文档中所示:

这不是一条硬线,但是越过这条线可能会产生影响!(很可能会)

这里重要的一件事是"不要模拟类型"通常是指 concrete internal 类型,因为这些类型更可能更有可能更改版本之间的行为,或者获得或丢失诸如finalstatic之类的修饰符,而Mockito的动态替代可能无法恢复。毕竟,如果您要手动分类第三方类,Java会丢下编译器错误。Mockito的语法将对您隐藏直到测试运行时。

列出我想到的因素:

  • 正如Assylias在评论中指出的那样,您指的是Java界面,该界面将您与final方法或方法可见性的常见更改隔离。
  • 该界面已有文献记录并为第三方扩展而设计,这是Java不太可能对界面的一般合同进行破坏的另一个原因。
  • 所讨论的界面是Java中一个非常使用的界面,总体上有很多用户,并且有很多向后兼容的问题。与一个较小的库或正在积极开发的图书馆相比,您不太可能受到破坏变化。甚至有人可能会说,JRE在Java语言上处于锁定步骤,您需要担心从breaking stytax 更改中,而不是从breaking interface 更改中。li>

尽管我坚信"不要模拟您不拥有的类型"作为一般的启发式或代码气味,但我在这里同意您的观点值得嘲笑,而且除非您写信并测试用于在其他测试中使用的完整实现,这是您在这里最适合您的路径。

我会说"不要模拟类型您不拥有!" 是正确的理由。

当您的 API更改或依赖性的API 您的代码使用部分时P>例子:

您将依赖关系作为输入参数的接口,但是您的测试代码仅在该接口中使用一种方法。如果您不模拟此界面(这是类型您不拥有),则必须创建自己的虚拟实现,以实现所有接口方法,即使是您不使用的方法。<<<<<<<<<<

如果更改该依赖关系的版本,则该接口可能具有其他方法和/或某些方法已被删除。您必须更改整个程序中此接口的实现所有。如果您嘲笑此界面,则不需要更改测试,它们仍然使您相信您的代码行为在所需的重构后不会更改。

此外,您的UNITSEST只能失败,因为您的代码的行为发生了变化,而不是因为依赖关系行为的变化。依赖关系行为的更改应与单独的Unitest固定,您为依赖关系行为设置(如果这对于您的应用程序至关重要)和/或集成测试

相关内容

  • 没有找到相关文章

最新更新