[譯]使用 Espresso 模擬 Application 實現(xiàn)依賴注入

原文:Mock Application in Espresso for Dependency Injection
作者:Chiu-Ki Chan
譯者:lovexiaov

我看了 Artem Zinnatullin 寫的使用 Dagger,Robolectric 和 InStrumentation 在單元測試,集成測試與功能測試中模擬依賴(譯者注:這里將鏈接替換成了中譯版本,文章中有原文鏈接)這篇好文。其中我最喜歡的部分是在測試中使用不同的 application 來提供不同的依賴,而我決定使用 Espresso 實現(xiàn)它。

通過自定義測試運行器模擬 application

我當(dāng)前實現(xiàn)依賴注入(譯者注:下文統(tǒng)一使用 DI)的方法是在我的測試 application 中暴露一個 setComponent 函數(shù)來提供測試組件,這樣并不是太好,因為理想情況下 application 中不能包含測試指定代碼。

一種新的實現(xiàn)方式是在 androidTest 文件夾中使用 application 的子類 ,并在測試時通過自定義測試運行器加載它。

public class DemoApplication extends Application {
  private final DemoComponent component = createComponent();

  protected DemoComponent createComponent() {
    return DaggerDemoApplication_ApplicationComponent.builder()
        .clockModule(new ClockModule())
        .build();
  }

  public DemoComponent component() {
    return component;
  }
}

在此 application 中,我們使用 createComponent() 實例化的 DemoComponent,并且將它存儲為 final 變量待以后使用。

public class MockDemoApplication extends DemoApplication {
  @Override
  protected DemoComponent createComponent() {
    return DaggerMainActivityTest_TestComponent.builder()
        .mockClockModule(new MockClockModule())
        .build();
  }
}

測試時,我們繼承自己的 application 并重寫 createComponent 來提供測試組件。

我們需要自定義測試運行器以在測試是使用模擬 application:

public class MockTestRunner extends AndroidJUnitRunner {
  @Override
  public Application newApplication(
      ClassLoader cl, String className, Context context)
      throws InstantiationException, 
             IllegalAccessException, 
             ClassNotFoundException {
    return super.newApplication(
      cl, MockDemoApplication.class.getName(), context);
  }
}

我們給出 MockDemoApplication.class.getName() 作為類名,這樣測試運行器將會加載模擬 application 而不是真實的 application。

按應(yīng)用還是按測試?

此方式與 setComponent 有些許不同,因為我們只初始化測試組件一次,而不是每個測試方法執(zhí)行前都要初始化。確保你在每次測試方法執(zhí)行前都清除了測試模塊的狀態(tài),這樣每個測試方法都能從零開始執(zhí)行。

源碼

我已經(jīng)在我的兩個倉庫中使用了此方式:

  • android-test-demo:迷你樣例演示的此概念。
  • friendspell:一個真實的應(yīng)用展示了怎樣在每個測試之前清除狀態(tài)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • 今天是圍棋第二課。 臨近下班,開始下雨。看看問題似乎不大,打算徒步過去上課。群里已經(jīng)開始請假了,后面還跟風(fēng)+1。關(guān)...
    金明啊閱讀 358評論 0 1
  • 知道我們“幸福家庭俱樂部”要做公益讀書會,反對的人不少。 理由主要有二:一、石獅人都在忙生意,喜歡讀書的人少得很。...
    _大陳_閱讀 427評論 1 0
  • 蘭頓酒足飯飽之后看著忙碌收拾碗具的妻子說“我說,咱們離婚怎么樣?你再嫁一個老公,我再娶個老婆”妻子便說“好啊,保證...
    髑髏閱讀 156評論 0 0