gpt4 book ai didi

java - 模拟 ScheduledExecutorService 与你不拥有的 "Don' t 模拟类型”哲学

转载 作者:行者123 更新时间:2023-11-30 06:46:37 26 4
gpt4 key购买 nike

模拟 ScheduledExecutorService确实会让我的类(class)测试更容易,但根据 mockito recommendations这似乎是个坏主意,因为模拟类的逻辑可能会以不正确的方式使用的方式发生变化,但单元测试仍会报告成功。

为它编写包装器似乎是“干净”的方式,但我感觉这只会导致接口(interface)的完全复制,这只会使我的代码不那么直接。我想遵循 this answer 的实用建议, 但我不确定 ScheduledExecutorService 的契约(Contract)将始终保持不变。

我可以假设 ScheduledExecutorService 的现有方法的契约(Contract)吗? (或者更一般地说,JRE 库中的任何其他类)永远不会改变?如果不是,如果我在集成测试中测试它的正确使用,同时仍然在单元测试中直接模拟它就足够了吗?

最佳答案

与其说是规则,不如说是指南;做最有可能导致干净、可靠和非脆弱测试的事情。正如您引用的文件中所述:

This is not a hard line, but crossing this line may have repercussions! (it most likely will)

这里有一件重要的事情是“不要模拟你不拥有的类型”通常指的是具体内部类型,因为它们更有可能在不同版本之间更改它们的行为,或者获得或失去 Mockito 的动态覆盖可能无法接受的修饰符,例如 finalstatic 。毕竟,如果您要手动子类化第三方类,Java 会抛出编译器错误;在测试运行时之前,Mockito 的语法会向您隐藏它。

列出我认为的因素:

  • 正如 assylias 在评论中指出的那样,您指的是 Java 接口(interface),它使您免受 final 方法或方法可见性的常见更改。
  • 该接口(interface)文档齐全,专为第三方扩展而设计,这提供了另一个原因,即 Java 不太可能对接口(interface)的通用契约进行重大更改。
  • 所讨论的接口(interface)是 Java 中一个非常常用的接口(interface),它总体上有很多用户,并且存在很多向后兼容性问题。与较小的库或正在积极开发的库相比,您不太可能会受到重大更改的影响。甚至有人可能会说 JRE 与 Java 语言步调一致,与破坏界面 更改相比,您更担心破坏语法 更改。

虽然我坚信“不要模拟你不拥有的类型”作为一般的启发式或代码味道,但我在这里同意你的观点,该类型值得模拟,而且——除非你要写并测试要在其他测试中使用的完整实现 - 这是您前进的最佳途径。

关于java - 模拟 ScheduledExecutorService 与你不拥有的 "Don' t 模拟类型”哲学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409533/

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