Язык во время unit test на Android - программирование
Подтвердить что ты не робот

Язык во время unit test на Android

У меня есть код, который я хочу проверить. Я хочу проверить, правильно ли составлена ​​строка из различных строк, которые у меня есть в ресурсах. Задача здесь состоит в том, чтобы иметь дело с несколькими переводами в моих ресурсах. Я знаю, что локаль может быть проблемой при тестировании настольного приложения и что рекомендуется создавать тесты, не зависящие от языка.

Я обнаружил, что вы можете установить языковой стандарт программно, но это не рекомендуется (см. программным образом изменить язык в Android). Хотя этот вопрос направлен на изменение языка во время выполнения при запуске приложения, я задавался вопросом, было ли лучшее решение моей проблемы.

4b9b3361

Ответ 1

Если это просто для тестирования, вы можете программно изменить языковой стандарт без каких-либо проблем. Это изменит конфигурацию вашего приложения, и вы сможете протестировать свой код с новым языковым стандартом. Он имеет такой же эффект, как если бы пользователь изменил его. Если вы хотите автоматизировать свои тесты, вы можете написать script, который изменяет локаль с помощью adb shell как описанный здесь, и после этого запускайте свои тесты.

Вот пример тестирования переводов слова "Отмена" для английского, немецкого и испанского языков:

public class ResourcesTestCase extends AndroidTestCase {

    private void setLocale(String language, String country) {
        Locale locale = new Locale(language, country);
        // here we update locale for date formatters
        Locale.setDefault(locale);
        // here we update locale for app resources
        Resources res = getContext().getResources();
        Configuration config = res.getConfiguration();
        config.locale = locale;
        res.updateConfiguration(config, res.getDisplayMetrics());
    }

    public void testEnglishLocale() {
        setLocale("en", "EN");
        String cancelString = getContext().getString(R.string.cancel);
        assertEquals("Cancel", cancelString);
    }

    public void testGermanLocale() {
        setLocale("de", "DE");
        String cancelString = getContext().getString(R.string.cancel);
        assertEquals("Abbrechen", cancelString);
    }

    public void testSpanishLocale() {
        setLocale("es", "ES");
        String cancelString = getContext().getString(R.string.cancel);
        assertEquals("Cancelar", cancelString);
    }

}

Вот результаты выполнения в Eclipse:

enter image description here

Обновление Android O.

При использовании в методе Android O Locale.setDefault(Category.DISPLAY, locale) следует использовать (подробнее см. изменения поведения).