本博客将讨论如何编写更多可单元测试的代码,以及应避免哪些模式和不良做法以提高可测试性。
可测试和不可测试的代码
在开发需要长期维护的大型应用程序时,我们必须依靠自动化测试来保持系统的整体质量。与将多个单元作为一个整体进行测试的集成测试相比,单元测试具有快速和稳定的优势。快速是因为我们理想情况下只实例化被测类,稳定是因为我们通常会模拟外部依赖项,例如数据库或网络连接。
如果您不熟悉单元测试和集成测试之间的确切区别,您可以在我们的测试简介博客中阅读有关此主题的更多信息。
可测试代码可以与代码库的其余部分隔离。换句话说,最小的单元可以独立测试。不可测试代码的编写方式使得很难甚至不可能为其编写良好的单元测试。
让我们回顾一下在编写可测试代码时应该避免的一些反模式和不良做法。
示例是用 Java 编写的,但此处提到的编码约定适用于任何面向对象的编程语言和测试框架。我们将在本博文中使用assertj和JUnit5作为示例。
依赖注入
它是实现测试隔离的最重要设计模式之一。波兰电话号码库 依赖注入是一种设计模式,其中一个对象通过构造函数参数或设置器接收其他对象(依赖项),而不必自己构造它们。

使用依赖注入,我们可以通过模拟对象的依赖项轻松隔离被测类。
我们来看一个没有依赖注入的例子:
由于引擎依赖项是在 Car 类的构造函数中构建的,因此可以说 Car 和 Engine 类是紧密耦合的。它们高度依赖彼此 - 更改一个就需要更改另一个。
从测试的角度来看,您无法单独测试 Car 类,因为上述示例无法用测试替身替换具体的 Engine 实现。
但是,我们可以通过使用依赖注入和多态来实现隔离:
阅读示例测试