遗留代码的 Java 重构策略

标签 java unit-testing testing mocking refactoring

我被要求对一些遗留代码进行单元测试。

目前,代码在方法调用和使用的类型方面都与第 3 方库紧密耦合。

我的第一个想法是 stub 第 3 方库(使用适当的模拟框架),这样我就可以轻松测试感兴趣的代码而不是第 3 方库。但是,为此,我需要重构一些代码,以便将感兴趣的代码与外部库依赖项隔离开来。

我最初的想法是提取接口(interface)并使用包装器调用库。但是,为了完全分离库,我也需要删除特定于库的类型,而不仅仅是方法调用,例如

LibrarySpecificType[] myVar = wrappedLibrary.DoX();

虽然我在上面的例子中包装了我的库调用,它仍然返回一个特定于库的类型,所以它仍然有些耦合。

我该如何解决这个问题?重构代码以启用此功能的最佳策略是什么?

谢谢!

最佳答案

  1. 我同意你的观点,为第三方库制作外观是个好主意。然后与这个外观而不是第 3 方库交谈。因此,唯一引用 lib 的地方是在您的外观中。

  2. LibrarySpecificType 的问题要复杂一些。同样,您可以将它们包裹起来,但这会有帮助吗?不确定

  3. 至于测试。我会使用 mockito/powermockito。您可以告诉它从您的库的模拟中返回一个模拟(LibrarySpecificType)并以这种方式进行测试。显然让一个 mock 返回一个 mock 是糟糕设计的标志,在这种情况下,它指向 LibrarySpecificType

关于遗留代码的 Java 重构策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282507/

相关文章:

即使在 Eclipse 中使用 JDK 1.7,java.nio.file 也无法正常工作

java - Java 库导出的相对路径

Android Studio 代码覆盖率未显示任何 Kotlin 类

angular - 注入(inject)新实例来测试 Angular(单例)服务持久性行为

Python:如何在我的测试套件中制作临时文件?

java - 如何在pdf中插入图表?

java - Activity 标签和多任务屏幕

python - 无法从 setUpClass 调用本地方法

java - junit测试用spring删除方法

python - Flask test_client 去除查询字符串参数