ActivityUnitTestCase 通常用來測試單獨(dú) Activity。在啟動被測試的 Activity 之前,你可以 Inject 一個假的 Context 或是 Application ,使用這個 Mock 的 Context 中一個隔離環(huán)境中運(yùn)行被測試的 Activity。通常用于 Activity 的單元測試,而不和 Anroid 系統(tǒng)進(jìn)行交互。
ActivityUnitTestCase 的類繼承關(guān)系如下圖:
http://wiki.jikexueyuan.com/project/android-test-course/images/11.1.jpg" alt="picture11.1" />
應(yīng)該要注意的是,作為單純的單元測試,被測試的 Activity 不運(yùn)行在一般應(yīng)用運(yùn)行的環(huán)境中也不和其它 Activity 產(chǎn)生交互。在這種情況下,不能調(diào)用下面的方法,如果調(diào)用一般會拋出異常:
createPendingResult(int, Intent, int)
startActivityIfNeeded(Intent, int)
startActivityFromChild(Activity, Intent, int)
startNextMatchingActivity(Intent)
getCallingActivity()
getCallingPackage()
createPendingResult(int, Intent, int)
getTaskId()
isTaskRoot()
moveTaskToBack(boolean)
下面的方法可以調(diào)用,但一般不起任何作用,你可以使用 getStartedActivityIntent() 和 getStartedActivityRequest() 來檢查參數(shù)值。
startActivity(Intent)
startActivityForResult(Intent, int)
下面的方法也可以調(diào)用,一般也無效果,可以使用 isFinishCalled() 和 getFinishedActivityRequest 檢查傳入的參數(shù)。
finish()
finishFromChild(Activity)
finishActivity(int)
ForwardingTest 的代碼如下:
public class ForwardingTest
extends ActivityUnitTestCase<Forwarding> {
private Intent mStartIntent;
private Button mButton;
public ForwardingTest() {
super(Forwarding.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mStartIntent = new Intent(Intent.ACTION_MAIN);
}
@MediumTest
public void testPreconditions() {
startActivity(mStartIntent, null, null);
mButton = (Button) getActivity().findViewById(R.id.go);
assertNotNull(getActivity());
assertNotNull(mButton);
}
@MediumTest
public void testSubLaunch() {
Forwarding activity
= startActivity(mStartIntent, null, null);
mButton = (Button) activity.findViewById(R.id.go);
mButton.performClick();
assertNotNull(getStartedActivityIntent());
assertTrue(isFinishCalled());
}
@MediumTest
public void testLifeCycleCreate() {
Forwarding activity
= startActivity(mStartIntent, null, null);
getInstrumentation().callActivityOnStart(activity);
getInstrumentation().callActivityOnResume(activity);
getInstrumentation().callActivityOnPause(activity);
getInstrumentation().callActivityOnStop(activity);
}
}
在 setUp 中,創(chuàng)建了一個 Mock Intent 對象 mStartIntent 用于測試 Activity。
按慣例測試方法 testPreconditions 通常作為第一個測試方法,如果該方法 Fail 的話,表示測試所需的條件不滿足,此時其它測試一般也會 Fail 。但這個方法并不一定是第一個運(yùn)行。
testSubLaunch 可以測試當(dāng)前 Activity 能否成功啟動其它 Activity,方法 getStartedActivityRequest 返回 當(dāng)前 Activity 調(diào)用 startActivityForResult(Intent, int) 的 request code. 方法 isFinishCalled 將在當(dāng)前 activity 調(diào)用 finish() 或 finishActivity, finishFromChild 后返回 true. Forwarding 示例參照 Android ApiDemos 示例解析(7):App->Activity->Forwarding
testLifeCycleCreate 測試 Activity 的生命周期回調(diào)函數(shù),使用 getInstrumentation 取的 Instrumentation 對象,通過 Instrumentation 對象可以調(diào)用 Activity 對應(yīng)的生命周期回調(diào)函數(shù)來測試 Activity 的 onCreate, onStart,onResume 等方法。
ActivityUnitTestCase 還提供了 sendKeys 方法模擬按鍵事件,可以用來測試 UI。