爲了有一個自定義RunListener
運行使用咖啡的Android儀器測試時,在測試故障進行自定義的東西。
TL;博士
InstrumentationInfo.metaData
是null
,即使ApplicationInfo.metaData
有我的信息。爲什麼?
進展迄今
我可以讓我RunListener用下面的ADB命令的工作:這是AndroidJUnitRunner here的文檔中指定
adb shell am instrument -w -e listener com.myproject.test.runlisteners.CustomRunListener -e class com.myproject.test.ui.HomeActivityTest#testWillFail com.myproject.test/android.support.test.runner.AndroidJUnitRunner
。
然而,文檔還指出一個可以指定在AndroidManifest.xml
元數據元素的RunListener。迄今爲止,我沒有成功實現這一目標。
AndroidManifest.xml中
我加入main/AndroidManifest.xml
下面我<application>
元素:
<meta-data
android:name="listener"
android:value="com.myproject.test.runlisteners.CustomRunListener" />
這並沒有任何影響。通過各種方式,我發現,這行代碼(由AndroidJUnitRunner
和RunnerArgs
用來從清單自定義元數據參數)
InstrumentationInfo instrInfo = pm.getInstrumentationInfo(
getComponentName(), PackageManager.GET_META_DATA);
Bundle b = instrInfo.metaData;
...回到我null
包。
我注意到生成的debug/AndroidManifest.xml
沒有我的元數據標記,所以,作爲一個實驗,我也將它添加到我的androidTest/AndroidManifest.xml
文件中。這看起來是這樣的:
<application
android:name=".BaseApplication">
<meta-data
android:name="listener"
android:value="com.sirius.test.runlisteners.CustomRunListener" />
</application>
...然後出現在產生debug/AndroidManifest.xml
像這樣:
<application android:name="com.myproject.BaseApplication" >
<meta-data
android:name="listener"
android:value="com.sirius.test.runlisteners.CustomRunListener" />
<uses-library android:name="android.test.runner" />
</application>
這也沒有任何效果。
另一項實驗
我創建了一個名爲CustomAndroidJUnitRunner
定製測試跑步延伸AndroidJUnitRunner只是引擎蓋下的峯值在位的目的。如果我這樣做:
ApplicationInfo ai = packageManager.getApplicationInfo(
getComponentName().getPackageName(), PackageManager.GET_META_DATA);
Bundle b = ai.metaData;
Object o = b.get("listener");
Log.d(TAG, "listener=" + o.toString());
... logcat的會說:
D/CustomAndroidJUnitRunner: listener=com.myproject.test.runlisteners.CustomRunListener
所以,ApplicationInfo.metaData
有它。爲什麼不InstrumentationInfo.metaData
?