我有一些代码需要进行测试。 我想检查一个字符串是否由我在资源中拥有的各种字符串正确组成。 这里的挑战是处理资源中的多个翻译。 我知道在测试桌面应用程序时,语言环境可能是一个问题,并且建议您创建与语言环境无关的测试。
我发现可以以编程方式设置语言环境,但不建议这样做(请参见 在 Android 中以编程方式更改语言)。 虽然此问题旨在在正常运行应用程序时在运行时更改语言环境,但我想知道是否有更好的解决方案来解决我的问题。
我有一些代码需要进行测试。 我想检查一个字符串是否由我在资源中拥有的各种字符串正确组成。 这里的挑战是处理资源中的多个翻译。 我知道在测试桌面应用程序时,语言环境可能是一个问题,并且建议您创建与语言环境无关的测试。
我发现可以以编程方式设置语言环境,但不建议这样做(请参见 在 Android 中以编程方式更改语言)。 虽然此问题旨在在正常运行应用程序时在运行时更改语言环境,但我想知道是否有更好的解决方案来解决我的问题。
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中的执行结果:
Android O升级。
在Android O中运行时,应使用Locale.setDefault(Category.DISPLAY, locale)
方法(有关详细信息,请参见行为更改)。
@RunWith(RobolectricGradleTestRunner.class)
。所以似乎我不能使用相同的解决方案。有什么建议吗? - P Kuijpers目前被接受的答案对我没有帮助。但是@Dennis的评论帮助我解决了问题。
使用Robolectric并通过指定资源限定符来覆盖语言环境。
例如,添加@Config(qualifiers="de-port")
以设置德语语言。
@Test
@Config(qualifiers = "de-port")
fun testGetLocaleGerman(){ ... }