我被要求对一些遗留代码进行单元测试。
目前,代码在方法调用和使用的类型方面都与第 3 方库紧密耦合。
我的第一个想法是 stub 第 3 方库(使用适当的模拟框架),这样我就可以轻松测试感兴趣的代码而不是第 3 方库。但是,为此,我需要重构一些代码,以便将感兴趣的代码与外部库依赖项隔离开来。
我最初的想法是提取接口(interface)并使用包装器调用库。但是,为了完全分离库,我也需要删除特定于库的类型,而不仅仅是方法调用,例如
LibrarySpecificType[] myVar = wrappedLibrary.DoX();
虽然我在上面的例子中包装了我的库调用,它仍然返回一个特定于库的类型,所以它仍然有些耦合。
我该如何解决这个问题?重构代码以启用此功能的最佳策略是什么?
谢谢!
最佳答案
我同意你的观点,为第三方库制作外观是个好主意。然后与这个外观而不是第 3 方库交谈。因此,唯一引用 lib 的地方是在您的外观中。
LibrarySpecificType 的问题要复杂一些。同样,您可以将它们包裹起来,但这会有帮助吗?不确定
至于测试。我会使用 mockito/powermockito。您可以告诉它从您的库的模拟中返回一个模拟(LibrarySpecificType)并以这种方式进行测试。显然让一个 mock 返回一个 mock 是糟糕设计的标志,在这种情况下,它指向 LibrarySpecificType
关于遗留代码的 Java 重构策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282507/