Android上的单元测试期间的区域设置

Xil*_*nic 25 globalization android unit-testing

我有一些我想测试的代码.我想检查String是否由我在资源中的各种字符串正确组成.这里的挑战是处理我的资源中的多个翻译.我知道在测试桌面应用程序时,语言环境可能是一个问题,并且建议您创建与语言环境无关的测试.

我发现您可以以编程方式设置区域设置,但不建议这样做(请参阅Android中以编程方式更改语言).虽然这个问题的目的是在正常运行应用程序时在运行时更改语言环境,但我想知道是否有更好的解决方案来解决我的问题.

ser*_*nka 53

如果它只是用于测试,那么您可以以编程方式更改语言环境而不会出现任何问题.它将更改您的应用程序的配置,您将能够使用新的区域设置测试您的代码.它具有与用户更改它相同的效果.如果你想自动化您的测试,你可以写一个脚本,使用改变区域设置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);
    }

}
Run Code Online (Sandbox Code Playgroud)

以下是Eclipse中的执行结果:

在此输入图像描述

Android O更新.

在Android中运行时,Locale.setDefault(Category.DISPLAY, locale)应使用O方法(有关更多详细信息,请参阅行为更改).

  • 我没有使用AndroidTestCase扩展我的测试,所以我无法获得上下文.我正在使用`@RunWith(RobolectricGradleTestRunner.class)`.所以我似乎无法使用相同的解决方案.有什么建议? (3认同)
  • 请尝试在拆卸方法中重置区域设置,以避免遇到问题。 (2认同)