我被困在这里了:
我的场景:我正在用TestNG运行一个测试,其中我调用了第三方库的一个函数。这个库使用Locale.getDefault()进行初始化。
为了独立于运行测试的机器获得相同的测试结果,我想设置一个特定的语言环境,然后重置它。不幸的是,尽管我可以将语言环境设置为我想要的值,但其他一些测试(不在同一个testClass中)却失败了……可能是由于格式问题(本地化)。
private Locale locale;
@BeforeClass
public void init() {
locale = Locale.getDefault();
Locale.setDefault(Locale.US);
}
@AfterClass
public void teardown() {
Locale.setDefault(locale);
}
@Test(dataProvider = "someDataProvider")
public void testThisWithUSLocale(String element) throws Exception {
String resultToTest = myClass.createSomething(element);
Assert.assertFalse(resultToTest.isEmpty());
}我尝试在@BeforeMethod中设置区域设置,但遇到了同样的问题……测试是异步运行的吗?在此测试中设置区域设置真的会影响其他测试吗?
发布于 2020-08-12 22:28:08
在JVM运行时更改语言环境是一个棘手的过程,整个应用程序都需要为此做好准备。来自setDefault的javadocs
由于更改默认语言环境可能会影响许多不同的功能领域,因此只有当调用者准备重新初始化在同一个Java虚拟机中运行的语言环境敏感代码时,才应使用此方法。
您的测试设置看起来是正确的,但是无论您的代码(或第三方库)做什么,都可能不支持更改语言环境。
发布于 2020-08-13 19:24:12
好了,我找到问题了:
区域设置最初设置为格式。因此,通过在@BeforeClass中运行所有内容,我的测试运行得很好,但在用Locale.setDefault(locale);“重置”了我之前保存的所有内容(但以错误的方式)之后,我设置了所有类别,而不仅仅是格式导致其他测试失败。正确的答案是:
private Locale locale;
@BeforeClass
public void init() {
locale = Locale.getDefault(Locale.Category.FORMAT);
Locale.setDefault(Locale.Category.FORMAT, Locale.US);
}
@AfterClass
public void teardown() {
Locale.setDefault(locale);
}https://stackoverflow.com/questions/63378221
复制相似问题