單元測試主要基於 JUnit 和 Robolectric 進行。Android Studio 默認集成好了 JUnit,而 Robolectric 則須要稍稍配置一下,這裏提供兩種方式進行配置。html
在每一個測試類上都加上註解java
@RunWith(RobolectricTestRunner.class)
@Config(application = TestMyApplication.class, constants = BuildConfig.class, manifest = "./AndroidManifest.xml",packageName = "com.your.package")
複製代碼
其中,TestMyApplication
是測試代碼的初始化Application,能夠把App的Application的邏輯放在這裏面android
TestMyRobolectricRunner
中集中配置buildGlobalConfig
方法@RunWith(RobolectricTestRunner.class)
註解,轉而使用 @RunWith(TestMyRobolectricRunner.class)
註解public class TestMyRobolectricRunner extends RobolectricTestRunner {
/** * Creates a runner to run {@code testClass}. Looks in your working directory for your AndroidManifest.xml file * and res directory by default. Use the {@link Config} annotation to configure. * * @param testClass the test class to be run * @throws InitializationError if junit says so */
public TestMyRobolectricRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
protected Config buildGlobalConfig() {
return new Config.Builder()
.setApplication(TestMyApplication.class)
.setConstants(BuildConfig.class)
.setManifest("AndroidManifest.xml")
.setPackageName("com.yongf.mypackagename")
.build();
}
}
複製代碼
SharedPreferences preferences = RuntimeEnvironment.application.getSharedPreferences(PREFERENCE_KEY, Context.MODE_PRIVATE);
複製代碼
好比,點擊一個按鈕之後在知足條件的狀況下,會跳轉到一個新頁面。怎麼測呢,能夠先知足各類設置條件,而後模擬按鈕點擊,而後獲取系統跳轉的下一個 activity 是否指定的 activity。git
//按鈕點擊後跳轉到下一個Activity
forwardBtn.performClick();
Intent expectedIntent = new Intent(sampleActivity, LoginActivity.class);
Intent actualIntent = ShadowApplication.getInstance().getNextStartedActivity();
assertEquals(expectedIntent, actualIntent);
複製代碼
某些狀況下,彈出Dialog。github
ShadowDialog latestDialog = ShadowApplication.getInstance().getLatestDialog();
複製代碼
遺憾的是,目前只能測試是否有對話框彈出,並不能測試對話框的內容(PS: 若是觀衆朋友你會的話,千萬別吝嗇你的才華,請在評論中或者 issue 中賜教~)app
某些狀況下,彈出 Toastide
Toast latestToast = ShadowToast.getLatestToast();
String textOfLatestToast = ShadowToast.getTextOfLatestToast();
複製代碼
能夠測試 Toast 的顯示,以及 Toast 的內容單元測試
參考上述 配置 Robolectric
章節的示例代碼測試
單個測試類,在[類|方法]上面添加 @Config(sdk = 21)
便可,具體的 sdk 版本本身指定ui
目前個人作法是指定 sdk 版本爲21如下,由於沒有動態權限,這樣須要用戶受權的部分就能走。但這樣帶來的問題就是,權限未受權的分支部分代碼沒有被覆蓋到。
若是你有更好的作法,趕忙來告訴我吧,謝謝啦~
onActivityResult
在運行的測試用例的時候,你可能會遇到以下錯誤:
java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.text.TextUtils.isEmpty(TextUtils.java)
at com.example.robolectric.TextUtilsTest.testIsEmpty(TextUtilsTest.java:14)
複製代碼
如何解決呢?很簡單,把 Android 源碼中這個類搬到測試代碼目錄下便可(注意要保持包名一致)
TODO