我有一些我想测试的代码。我想检查String是否由我在资源中的各种字符串正确组成。这里的挑战是处理我的资源中的多个翻译。我知道在测试桌面应用程序时,语言环境可能是一个问题,并且建议您创建与语言环境无关的测试。
我发现你可以以编程方式设置语言环境,但不建议这样做(参见Change language programmatically in Android)。虽然这个问题的目的是在正常运行应用程序时在运行时更改语言环境,但我想知道是否有更好的解决方案来解决我的问题。
如果它只是用于测试,那么您可以以编程方式更改语言环境而不会出现任何问题。它将更改您的应用程序的配置,您将能够使用新的区域设置测试您的代码。它具有与用户更改它相同的效果。如果要自动化测试,可以使用adb shell
编写一个更改语言环境的脚本作为described here,然后启动测试。
以下是测试英语,德语和西班牙语语言环境中“取消”一词的翻译的示例:
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中的执行结果:
Android O更新。
在Android O方法中运行时,应使用Locale.setDefault(Category.DISPLAY, locale)
(有关详细信息,请参阅behaviour changes)。