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