30

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

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

4

2 回答 2

63

如果只是为了测试,那么您可以通过编程方式更改语言环境而不会出现任何问题。它将更改您的应用程序的配置,您将能够使用新的语言环境测试您的代码。它具有与用户更改它相同的效果。如果你想自动化你的测试,你可以编写一个脚本,使用这里描述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 中的执行结果:

在此处输入图像描述

安卓 O 更新。

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

于 2014-02-16T10:46:58.550 回答
1

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

使用 Robolectric 并通过指定资源限定符覆盖区域设置。

添加例如@Config(qualifiers="de-port")德语。

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

Robolectrics 文档

于 2021-12-03T14:52:54.363 回答