Android单元测试中的Locale设置

33

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

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


我也对此很感兴趣,因此设置了悬赏。我的具体要求是:我正在Eclipse中进行测试,并且希望能够尽可能顺畅地在套件内更改区域设置,包括时区。我希望在答案中看到如何实现的详细示例。 - Matt Gibson
@MattGibson 我更新了我的答案,并提供了一个可行的示例。它会更改日期格式化程序和应用程序资源的区域设置。 - sergej shafarenka
2个回答

66
如果只是为了测试,您可以在没有任何问题的情况下通过编程方式更改区域设置。这将更改应用程序的配置,您将能够使用新的区域设置测试代码。它具有与用户更改相同的效果。如果您想自动化测试,您可以编写一个脚本,使用 adb shell 更改区域设置,如此处所述,然后启动测试。
以下是测试单词“Cancel”在英语、德语和西班牙语区域设置下的示例:
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) 方法(有关详细信息,请参见行为更改)。


3
我不使用AndroidTestCase来扩展我的测试,因此我无法获取上下文。我正在使用@RunWith(RobolectricGradleTestRunner.class)。所以似乎我不能使用相同的解决方案。有什么建议吗? - P Kuijpers
1
在Robolectric中,您需要使用测试配置中的限定符覆盖语言环境。请参阅http://robolectric.org/using-qualifiers/获取更多信息。 - Dennis
2
请尝试在拆卸方法中重置Locale,以避免遇到问题。 - moxi

2

目前被接受的答案对我没有帮助。但是@Dennis的评论帮助我解决了问题。

使用Robolectric并通过指定资源限定符来覆盖语言环境。

例如,添加@Config(qualifiers="de-port")以设置德语语言。

@Test
@Config(qualifiers = "de-port")
fun testGetLocaleGerman(){  ...   }

Robolectrics Documentation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接