包装外部库返回类型的策略

时间:2015-10-27 09:16:51

标签: unit-testing junit mocking refactoring tdd

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

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

我打算以Façade设计模式的形式在库周围编写一个包装器,这将有助于测试性,为其余部分创建一个更清晰的界面代码,如果需要,允许我将来换出库。

这在方法调用 void return type 的情况下工作正常,因为库函数是自包含的。但是,如果现有代码使用特定于库的类型呢?这里有一个例子:

LibrarySpecificType[] myVar = wrappedLibrary.DoX();

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

有人知道解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您可以围绕返回的类型创建包装类,并让wrappedLibrary返回这些包装类型。如果这些类型中的每一个都公开接受和返回其他类型的方法,那么这可能是相当多的工作。像这样:

WrappedLibrarySpecificType[] myVar = wrappedLibrary.DoX();

然后在库中,包装器必须调用实际的库并包装库返回的类型并返回包装类型。

这最终成了一个兔子洞,你可能需要包裹每一种类型。

如果这是一个大型库,您可能会在编写(或使用)工具时找到一些好处,该工具可以通过反映第三方库中的类型来为您生成包装器

您可能会在generating the delegating members获得一些帮助,具体取决于您的想法