【Android】單元測試方法簡介
前言
基本單元測試框架
Java單元測試框架:Junit、Mockito、Powermockito等;
Android單元測試框架:Robolectric、AndroidJUnitRunner、Espresso等。
最開始建議先學習Junit & Mockito。這兩款框架是java領域應用非常普及,使用簡單,官網的說明也很清晰。junit執行在jvm上,所以只能測試純java,若要測試依賴android庫的程式碼,可以用mockito**隔離依賴**(下面會談及)。
之後學習AndroidJUnitRunner,Google官方的android單元測試框架之一,使用跟Junit
然後可以嘗試Robolectric & Espresso。Robolectric執行在jvm上,但是框架本身引入了android依賴庫,所以可以做android單元測試,執行速度比執行在真機or模擬器快。但Robolectric也有侷限性,例如不支援載入so,測試程式碼也有點彆扭。當然,robolectric可以配合junit、mockito使用。Espresso也是Google官方的android單元測試框架之一,強大就不用說了,測試程式碼非常簡潔。Espresso本身執行在真機上,因此android任何程式碼都能執行,不像junit&mockito那樣隔離依賴。缺點也是顯而易見,由於執行在真機,不能避免“慢”
Junit
Junit測試順序:@FixMethodOrder
Powermockito
如何mock單例模式
【Unit Test Hints】: How to mock a Singleton using PowerMock
Robolectric
使用Robolectric時,你可能會遇到問題。因為Robolectric對於每一個測試元件都使用了一個新的擁有不同設定的ClassLoader。對於PowerMock也是一樣,對於每一個基本元件,它都提供了一個ClassLoader,並且規定他們都為不可重用狀態。
JVM有兩個非常重要的相關限制:
- 一個共享的庫在一個程序中只能被載入一次.
- ClassLoader不共享載入的庫的資訊
因此在測試執行中使用多個ClassLoader是非常有問題的。因為每一個Classloader例項都會嘗試載入so,但是除了第一個會成功之外,其它的都會報Native library XXX already loaded in another classloader(已經在另一個classloader被載入過了)的異常.
避免這個的唯一方法是避免使用多個ClassLoader,如果必須使用新的ClassLoader,則使用fork程序的方式.