我想运行具有不同语言环境的参数化仪器测试,以使用所有支持的语言运行相同的测试。
观察到的行为是该活动将具有第一次测试运行的本地化标题,也适用于随后的每次运行。因此,无论我的手机使用哪种语言,标题都会在第一次参数化测试运行时正确本地化,并且对于接下来的每个测试运行仍然相同。
虽然覆盖语言环境本身适用于任何资源,但如果由.AndroidManifest.xml
活动似乎在 中设置了它们的标题attach
,并且任何调用 attach 似乎都将标题缓存在应用程序首次启动的语言环境中。
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
---> CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
attachBaseContext(context);
由于资源总是得到正确本地化,解决方法是调用setTitle(R.string.title)
或只是getActionBar().setTitle(R.string.setTitle)
,但我不想仅仅为了测试目的而更改活动。
问题:如何在第一次测试运行后更改启动活动的标题?如上所述,这似乎被缓存并且没有正确更新,并且杀死应用程序以重新启动它会使检测测试失败。
测试设置
整个测试项目可以在 GitHub 上找到(Localization.java
包含当前失败的单元测试以及此处描述的问题),并且将参数化单元测试与UIAutomator
.
目标是在不太了解应用程序本身(UIAutomator)的情况下拍摄一批屏幕截图,并且也不必为测试修改应用程序。
更改语言环境:
我在每次测试之前成功地更改了语言环境,并且通过执行以下操作正确显示了我的文本,而且我有多个断言确保资源实际上是正确的语言环境。
public LocalizationTest(Locale locale) {
mLocale = locale;
Configuration config = new Configuration();
Locale.setDefault(mLocale);
config.setLocale(mLocale);
Resources resources = InstrumentationRegistry.getTargetContext().getResources();
resources.updateConfiguration(config, resources.getDisplayMetrics());
resources.flushLayoutCache();
}
什么不起作用:
我显然尝试在目标上下文、应用程序上下文和活动上以相同的方式设置语言环境(无论如何这可能为时已晚)。
我看到它attach
是从 调用的Instrumentation
,但只是创建一个新应用程序并尝试启动该活动也不会本地化标题。
Intent intent = context.getPackageManager().getLaunchIntentForPackage(BuildConfig.APPLICATION_ID);
context = InstrumentationRegistry.getInstrumentation().newApplication(App.class,
InstrumentationRegistry.getTargetContext());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);