簡體   English   中英

為第三方庫的依賴項注入編寫包裝程序和接口的自動化方法?

[英]Automated way to write a wrapper and interface for dependency injection of third party libraries?

我正在使用第三方庫類Foo ,該類具有一些公共方法和屬性,我的類將它們用作依賴項。

我想測試我的類並模擬Foo對象,但是它沒有接口。 所以我在想,我可以在自己的類中繼承該類,提取一個接口,瞧! 我將有一個可注射的接口。

...但是當然會有並發症。 Foo有很多公共場所。 這些不能進入接口,因此我必須為字段編寫屬性包裝器。 它很煩人。

有自動化的方法嗎? 我有ReSharper,但似乎沒有一種方法可以自動完成此操作,這意味着我正在編寫許多繁瑣的代碼。

您應該將測試中的班級分為兩個單獨的班級。 一類包含您需要測試的(業務)邏輯,另一類充當外部依賴項的適配器。 該適配器類應實現一個接口,而邏輯類應依賴於該接口。 此接口應該模仿外部依賴的API,但接口必須在應用程序的需求來定義。 通過這樣做,您可以實現:

  • 遵守“ 單一責任原則” ,因為當前您正在測試的班級有兩個職責。
  • 通過將新適配器放在抽象后面來遵守“ 依賴倒置原則” 這樣可以防止您的應用程序依賴於外部工具(僅需要您的合成根目錄依賴),從而使您的應用程序更易於測試和維護。
  • 遵守接口隔離原則 ,該原則指出接口應狹窄並針對其參與的角色進行定義。

您最終將得到一個與外部庫緊密耦合的適配器類。 該適配器會將傳入的呼叫轉換為可以發送到外部庫的內容。 該適配器不能單獨進行測試,如果測試很重要,則可能需要對此進行集成測試(取決於外部庫的工作方式)。 要說的重要一點是,您不必測試外部庫是否有效,但是您可能仍想測試適配器類的正確性。

我將創建一個包裝器類,該包裝器類使用您設計的接口,只暴露Foo所需的內容。

因此,例如:

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

您可以通過使MyFooWrapper成為一個抽象類來包含屬性和任何其他基本功能的抽象類,但不要在那里放Foo,而是有一個繼承foo包裝器的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM