为了有一个自定义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
?