问题描述
我被困在这里:
我的情况: 我正在用TestNG运行测试,在其中我调用了第三方库的函数。该库使用Locale.getDefault()初始化。
要独立于运行测试的计算机获得相同的测试结果,我想设置一个特定的区域设置,然后将其重置。 不幸的是,尽管我可以将Locale设置为所需的值,但是似乎其他一些测试(不在同一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中设置区域设置,但存在相同的问题... 测试是否异步运行?在此测试中设置区域设置是否真的会影响其他测试?
解决方法
在JVM运行时更改语言环境是一个棘手的过程,因此整个应用程序都需要为此做好准备。来自setDefault
由于更改默认语言环境可能会影响许多不同的功能领域,因此仅当调用者准备重新初始化在同一Java虚拟机中运行的对语言环境敏感的代码时,才应使用此方法。
您的测试设置看起来正确,但是无论您的代码(或第三方库)做什么,都可能不支持语言环境的更改。
,好的,我发现了问题:
最初为FORMAT设置了语言环境。因此,通过在@BeforeClass
中运行所有内容,我的测试工作正常,但是在用早先保存的Locale.setDefault(locale);
“重置”所有内容之后(以错误的方式),我设置了“所有类别”,而不是只是FORMAT使其他测试失败。正确的是:
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);
}