1. 程式人生 > >Android單元測試學習筆記

Android單元測試學習筆記

按照文章內容,我總結如下:
“單元測試,是為了測試某一個類的某一個方法能否正常工作,而寫的測試程式碼”:

  • 方法有返回值(包括異常):使用JUnit框架
  • 方法無返回值:
    1) 策略:mock, spy
    2) 框架:Mockito。用途:1. 驗證方法呼叫 2. 指定mock物件的某些方法行為,方法有返回值與無返回值不同處理。

mock需要進行依賴注入
方法:1. setter injection 2. argument injection *3. constructor injection
框架:Dagger2(必要時才用),原理:

  • 生產Dependency的工廠:Module
  • Dependency工廠管理員:Component

Component給Client提供Dependency的方法:

  1. 在Component裡面定義一個返回Dependency的方法
  2. Field Injection

Robolectric:在JVM上呼叫Android的類,協助進行Android單元測試。

不過,在實際編寫程式碼時,也遇到不少問題:

  1. 文章中提到幾個框架,分別是JUnitMockitoDaggerRobolectric,配置方法:
    testCompile 'junit:junit:4.12'
    testCompile "org.mockito:mockito-core:2.+"
    testCompile "org.robolectric:robolectric:3.4.2"
    
    版本號會更新,詳見官網。
  2. 作者在介紹Dagger時,定義了AppComponent後,對應的自動生成類叫做DaggerAppComponent。
    作者沒說這個是怎麼才能生成的,其實可以點選工具欄上的Make Project,或者快捷鍵Ctrl+F9,其實這就是一個編譯的過程。
  3. 在執行Robolectric測試前,Android Studio會下載Robolectric的jar包等,然而這個可能因為某些你懂得的原因而下載奇慢,解決方法見加速Robolectric下載依賴庫及原理剖析
  4. 在用Robolectric測試時,出現找不到AndroidManifest.xml的報錯,解決方案見Stack Overflow
  5. 在用Robolectric測試時,出現找不到android.content.pm.ShortcutManager的類檔案這麼一個錯誤,在Android API官網可以找到這個類是在API level 25才新增的,而專案的compileSdkVersion是23。我也不清楚怎麼會去找這個類,估計是因為我用了最新的Robolectric,而它要求最新的Android介面吧。將compileSdkVersion改成25解決。
  6. 文中的示例程式碼中有一句:
    Assert.assertEquals(expectedIntent, actualIntent);
    然而這句話是肯定會報錯的,因為看assertEquals的原始碼可以發現判斷相等的依據是expected.equals(actual),這對於Intent來說就是要同一個物件的不同引用才會相等。
    解決方法可以參考Stack Overflow或者Writing Your First Test | Robolectric