自动编写第三方库依赖注入的包装器和接口

本文关键字:包装 接口 注入 依赖 第三方 | 更新日期: 2023-09-27 18:05:06

我正在使用第三方库类Foo,它有几个公共方法和属性,我的类将其作为依赖项使用。

我想测试我的类并模拟Foo对象,但它没有接口。所以我在想,我可以在我自己的类中继承这个类,提取一个接口,瞧!我将有一个可注入的接口。

…当然,这其中也有复杂的因素。Foo有一堆公共字段。这些不能放到接口中,所以我必须为字段编写属性包装器。它是烦人。

是否有一种自动的方法来做到这一点?我有ReSharper,但似乎没有办法自动做到这一点,这意味着我写了很多繁琐的代码。

自动编写第三方库依赖注入的包装器和接口

您应该将要测试的类分成两个单独的类。一个类包含需要测试的(业务)逻辑,另一个类充当外部依赖项的适配器。这个适配器类应该实现一个接口,逻辑类应该依赖于这个接口。这个接口应该而不是模拟外部依赖的API,但是接口应该在应用程序的需求中定义。通过这样做,您可以:

  • 坚持单一职责原则,因为目前你的类在测试中有两个职责。
  • 坚持依赖倒置原则,将新的适配器置于抽象之后。这可以防止你的应用程序依赖于外部工具(只有你的组合根需要依赖它),这使得你的应用程序更可测试,更易于维护。
  • 坚持接口隔离原则,即接口应该是窄的,并根据它们所参与的角色来定义。

您最终得到的是一个与外部库紧密耦合的适配器类。此适配器将把传入调用转换为可以发送到外部库的内容。这个适配器不能单独测试,如果测试很重要,您可能需要为此进行集成测试(取决于外部库的功能)。重要的是,您不必测试外部库是否工作,但您可能仍然希望测试适配器类的正确性。

我会创建一个包装器类,它使用您设计的接口,只公开您需要的Foo。

例如:

class MyFooWrapper : IFoo
{
   private Foo _foo;
    // methods exposed by IFoo
 }

你可以更进一步,使MyFooWrapper成为一个抽象类来包含属性和任何其他基本功能,但不把Foo放在那里,而是有一个继承Foo包装器的类。