Я хочу запустить параметризованный инструментальный тест с разными локалями, чтобы запустить один и тот же тест со всеми поддерживаемыми языками.
Наблюдаемое поведение заключается в том, что активность будет иметь локализованное название первого тестового запуска также и для каждого последующего запуска. Таким образом, независимо от того, на каком языке работает мой телефон, название будет корректно локализовано для первого запуска параметризованного теста и будет одинаковым для каждого последующего.
Хотя перезапись локалей сама по себе работает для любых ресурсов, она будет работать только один раз для заголовка действий, если это установлено параметром AndroidManifest.xml
.
Действия, кажется, получают свой заголовок один раз в 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);