2011-11-18 51 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有一些靜態輔助方法,並允許切換默認語言環境爲單獨測試。