我被要求对一些遗留代码进行单元测试。
目前,代码在方法调用和使用的类型方面与第三方库紧密耦合。
我的第一个想法是存根第三方库(使用适当的模拟框架),以便我可以轻松地测试感兴趣的代码而不是第三方库。但是,要做到这一点,我需要重构一些代码,以便感兴趣的代码与外部库依赖关系隔离。
我最初的想法是提取一个接口并使用包装器来调用库。但是,要完全解耦库,我还需要删除库特定类型,而不仅仅是方法调用,例如
LibrarySpecificType[] myVar = wrappedLibrary.DoX();
虽然我已经在上面的例子中包装了我的库调用,但它仍然返回一个特定于库的类型,所以它仍然有点耦合。
我如何解决这个问题?重构代码以实现此目的的最佳策略是什么?
谢谢!
答案 0 :(得分:0)
我同意你的看法,为第三方lib创建一个外观是个好主意。然后谈谈这个立面而不是第三方lib。因此,引用lib的唯一位置就在你的门面。
LibrarySpecificType的问题有点问题。你可以再包装它们,但这会有帮助吗?不确定
至于测试。我会用mockito / powermockito。你可以告诉它从你的库的模拟中返回一个mock(of LibrarySpecificType)并以这种方式测试。显然有一个模拟返回模拟是一个糟糕的设计的标志,在这种情况下指向LibrarySpecificType