聲明:本系列文章是對(duì) Android Testing Support Library官方文檔的翻譯,水平有限,歡迎批評(píng)指正。
1. Espresso 概覽
2. Espresso 設(shè)置說(shuō)明
3. Espresso 基礎(chǔ)
4. Espresso 備忘錄
5. Espresso 意圖
6. Espresso 高級(jí)示例
7. Espresso Web
8. AndroidJUnitRunner
9. ATSL 中的 JUnit4 規(guī)則
10. UI Automator
11. 可訪問(wèn)性檢查
Espresso-Intents 是 Espresso 的一個(gè)擴(kuò)展,它使驗(yàn)證和存根待測(cè)應(yīng)用向外發(fā)出的意圖成為可能乱投。它類似于 Mockito,但是針對(duì)的是 Android 的意圖顷编。
下載 Espresso-Intents
- 確保你已經(jīng)安裝了 Android Support Repository(參考 instructions)戚炫。
- 打開你應(yīng)用的
?build.gradle
? 文件。這一般不是頂級(jí)的?build.gralde
? 文件媳纬,而是?app/build.gradle
?双肤。
在 dependencies 中添加以下行:
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'
Espresso-Intents 只兼容 Espresso 2.1+ 和 testing support library 0.3。所以確保你也更新了以下行:
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
IntentsTestRule
當(dāng)使用 Espresso-Intents 時(shí)钮惠,應(yīng)當(dāng)用 ?IntentsTestRule
? 替換 ?ActivityTestRule
?茅糜。IntentsTestRule
? 使得在 UI 功能測(cè)試中使用 Espresso-Intents API 變得簡(jiǎn)單。該類是 ?ActivityTestRule
? 的擴(kuò)展素挽,它會(huì)在每一個(gè)被 ?@Test
? 注解的測(cè)試執(zhí)行前初始化 Espresso-Intents蔑赘,然后在測(cè)試執(zhí)行完后釋放 Espresso-Intents。被啟動(dòng)的 activity 會(huì)在每個(gè)測(cè)試執(zhí)行完后被終止掉预明,此規(guī)則也適用于 ?ActivityTestRule
?缩赛。
驗(yàn)證意圖(Intent validation)
Espresso-Intents 會(huì)記錄待測(cè)應(yīng)用里所有嘗試啟動(dòng) Activity 意圖。使用 intended API(與 ?Mockito.verify
? 類似)你可以斷言特定的意圖是否被發(fā)出撰糠。
驗(yàn)證外發(fā)意圖的簡(jiǎn)單示例:
@Test
public void validateIntentSentToPackage() {
// User action that results in an external "phone" activity being launched.
user.clickOnView(system.getView(R.id.callButton));
// Using a canned RecordedIntentMatcher to validate that an intent resolving
// to the "phone" activity has been sent.
intended(toPackage("com.android.phone"));
}
意圖存根(Intent stubbing)
使用 intending API(與 ?Mockito.when
? 類似)你可以為通過(guò) startActivityForResult 啟動(dòng)的 Activity 提供一個(gè)響應(yīng)結(jié)果(尤其是外部的 Activity酥馍,因?yàn)槲覀儾荒懿僮魍獠?activity 的用戶界面,也不能控制 ?ActivityResult
? 返回給待測(cè) Activity)阅酪。
使用意圖存根的示例:
@Test
public void activityResult_IsHandledProperly() {
// Build a result to return when a particular activity is launched.
Intent resultData = new Intent();
String phoneNumber = "123-345-6789";
resultData.putExtra("phone", phoneNumber);
ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData);
// Set up result stubbing when an intent sent to "contacts" is seen.
intending(toPackage("com.android.contacts")).respondWith(result));
// User action that results in "contacts" activity being launched.
// Launching activity expects phoneNumber to be returned and displays it on the screen.
onView(withId(R.id.pickButton)).perform(click());
// Assert that data we set up above is shown.
onView(withId(R.id.phoneNumber).check(matches(withText(phoneNumber)));
}
意圖匹配器(Intent Matchers)
?intending
? 和 ?intended
? 方法用一個(gè) hamcrest ?Matcher<Intent>
? 作為參數(shù)物喷。 Hamcrest 是匹配器對(duì)象(也稱為約束或斷言)庫(kù)。有以下選項(xiàng):
- 使用現(xiàn)有的意圖匹配器:最簡(jiǎn)單的選擇遮斥,絕大多數(shù)情況的首選峦失。
- 自己實(shí)現(xiàn)意圖匹配器,最靈活的選擇(參考 Hamcrest 教程 的 “Writing custom matchers” 章節(jié))
以下是一個(gè)使用現(xiàn)有的意圖匹配器驗(yàn)證意圖的示例:
intended(allOf(
hasAction(equalTo(Intent.ACTION_VIEW)),
hasCategories(hasItem(equalTo(Intent.CATEGORY_BROWSABLE))),
hasData(hasHost(equalTo("www.google.com"))),
hasExtras(allOf(
hasEntry(equalTo("key1"), equalTo("value1")),
hasEntry(equalTo("key2"), equalTo("value2")))),
toPackage("com.android.browser")));