2011-11-18 52 views
3

我有一个开源的库,它有大量的比较字符串形式的数字的单元测试。jUnit在多种文化中测试Double.toString

这些测试在en-GBen-US和其他文化,其中号通常写成如下形式1,234.00经过精磨。

但是在诸如德国和法国的文化中,这些值格式不同,测试失败。

如何JUnit测试被迫为en-GB运行?

编辑this kind of thing在NUnit有售。

回答

4

我不知道它是所有JVM标准,但使用Oracle的JVM在Windows上,你可以使用user.language和user.country系统属性设置启动JVM时的语言环境:

java -Duser.language=en -Duser.country=GB ... 

您还可以,当然,设置在Java中默认的语言环境,使用

Locale.setDefault(new Locale("en", "GB")); 

注意Double.toString是语言环境无关,但。

+0

我不得不使用第二种方法,因为我无法控制从我的库通过IDE运行测试的开发人员的JVM(例如)。不过,我担心的是,在调用此语言之后,语言环境仍将设置为其他测试的en-GB,这可能会使其他代码库的测试失败。你知道一种限制本地区适用的时间的方法,而不必在@ Before/@ After方法中调用getLocale/setLocale吗? –

1

你如何启动jUnit?

传递适当的语言属性将取决于你的环境比jUnit本身更多。

或者(我认为这是一个更好的解决方案),你就可以比较值,而不是字符串:

assertEquals(12.3, Double.valueOf(aDoubleString)); 
assertEquals(Double.toString(12.3), aDoubleString); 

而不是

assertEquals("12.3", aDoubleString) 
+0

这是一个开源的库,所以我无法控制其他人如何启动jUnit。你的想法是一个有趣的想法,但是不是将字符串解析为也受文化特定规则支配的双打? –

+0

这就是要点。法国的“12.3”可能是“12,3”。但是,assertEquals(“12.3”,“12,3”)会失败,希望valueOf(或其他一些NumberFormat本地友好解析方法)能正确解释值。 – ptyx

+0

我指的是'Double.valueOf',以及它是否将''1.234“'和'”1,234“'作为相同的值,而不考虑语言环境。我的猜测是,它不能,所以问题从格式的语言环境转移到语法分析。当我解决问题时,我会牢记这一点,所以再次感谢您的想法。 –

0

有两个学家使用JUnit 4分的规则修改一对夫妇的测试默认语言环境:

LocaleRule,一个非常简单的实现。

DefaultLocaleRule有一些静态辅助方法,并允许切换默认语言环境为单独测试。