Android - измените локаль в тесте JUnit / Espresso, чтобы создавать скриншоты приложения с использованием правил - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь использовать JUnit и Espresso для создания скриншотов приложения.Проблема в том, что мне также нужно изменить локаль устройства (эмулятора) перед тем, как сделать снимок экрана, и эта часть не работает (без ошибок).Снимок экрана сделан с языком, установленным в устройстве эмулятора, а не с тем, который я установил в тесте.

Я создал LocaleRule для установки языка.

public class LocaleRule implements TestRule {
    private final Locale locale;
    private Locale mDeviceLocale;

    public LocaleRule(Locale locale) {
        this.locale = locale;
    }


    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                   mDeviceLocale = Locale.getDefault();
                   setLocale(locale);
                   base.evaluate();
                } finally {
                    if (mDeviceLocale != null) {
                        setLocale(mDeviceLocale);
                    }
                }
            }
        };
    }


    private void setLocale(Locale locale) {
        Resources resources = InstrumentationRegistry.getTargetContext().getResources();
        Locale.setDefault(locale);
        Configuration config = new Configuration(resources.getConfiguration());
        config.setLocale(locale);
        resources.updateConfiguration(config, resources.getDisplayMetrics());
    }
}

И этотестовый класс.

    @RunWith(AndroidJUnit4.class)
public class CountrySelectionActivityScreenshot {

    private final LocaleRule mLocaleRule = new LocaleRule(english());
    private final ActivityTestRule mActivityTestRule = new ActivityTestRule<>(CountrySelectionActivity.class);
    private final ScreenshotWatcher mScreenshotWatcher = new ScreenshotWatcher();
    private final GrantPermissionRule mGrantPermissionRule = GrantPermissionRule.grant(READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE);

    @Rule
    public final RuleChain mRuleChain = RuleChain.outerRule(mLocaleRule)
            .around(mScreenshotWatcher)
            .around(mGrantPermissionRule)
            .around(mActivityTestRule);

    @Test
    public void countrySelectionActivityPortrait() {
    }
}
...