Android單元測試學習筆記
阿新 • • 發佈:2019-01-30
按照文章內容,我總結如下:
“單元測試,是為了測試某一個類的某一個方法能否正常工作,而寫的測試程式碼”:
- 方法有返回值(包括異常):使用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的方法:
- 在Component裡面定義一個返回Dependency的方法
- Field Injection
Robolectric:在JVM上呼叫Android的類,協助進行Android單元測試。
不過,在實際編寫程式碼時,也遇到不少問題:
- 文章中提到幾個框架,分別是JUnit, Mockito, Dagger, Robolectric,配置方法:
版本號會更新,詳見官網。testCompile 'junit:junit:4.12' testCompile "org.mockito:mockito-core:2.+" testCompile "org.robolectric:robolectric:3.4.2"
- 作者在介紹Dagger時,定義了AppComponent後,對應的自動生成類叫做DaggerAppComponent。
作者沒說這個是怎麼才能生成的,其實可以點選工具欄上的Make Project,或者快捷鍵Ctrl+F9,其實這就是一個編譯的過程。 - 在執行Robolectric測試前,Android Studio會下載Robolectric的jar包等,然而這個可能因為某些你懂得的原因而下載奇慢,解決方法見加速Robolectric下載依賴庫及原理剖析。
- 在用Robolectric測試時,出現找不到AndroidManifest.xml的報錯,解決方案見Stack Overflow
- 在用Robolectric測試時,出現找不到android.content.pm.ShortcutManager的類檔案這麼一個錯誤,在Android API官網可以找到這個類是在API level 25才新增的,而專案的compileSdkVersion是23。我也不清楚怎麼會去找這個類,估計是因為我用了最新的Robolectric,而它要求最新的Android介面吧。將compileSdkVersion改成25解決。
- 文中的示例程式碼中有一句:
然而這句話是肯定會報錯的,因為看assertEquals的原始碼可以發現判斷相等的依據是expected.equals(actual),這對於Intent來說就是要同一個物件的不同引用才會相等。Assert.assertEquals(expectedIntent, actualIntent);
解決方法可以參考Stack Overflow或者Writing Your First Test | Robolectric。