2010-11-02 64 views
3

我在寫一個Junit測試,其中預期的結果是一個XML字符串。代表預期字符串的最佳方式是什麼?現在我把它作爲一個stringBuilder,我做了以下。我想斷言實際和預期是相同的。什麼是最有效的方式來表示這個預期的字符串?另外我不希望任何人改變預期的字符串,所以它也應該是最終的。Junit測試的預期結果的Xml字符串表示

@Before 
public void setUp() { 
    expected.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
    expected.append("<n-relationship guid=\"IEEBFAD40BC5711DFAE41F5F92790F896\" control=\"add\">"); 
    expected.append("<n-relbase>ID17A8B10BC5711DFAE41F5F92790F896</n-relbase><n-reltype>IPLS</n-reltype>"); 
    expected.append("<ip.content><pub.no>1234567</pub.no>"); 
    expected.append("<event.date>2010-09-10</event.date><event.code>02394802323</event.code>"); 
    expected.append("<event.treatment>+</event.treatment><event.description>OPPOSITION DISMISSED</event.description>"); 
    expected.append("</ip.content></n-relpayload></n-relationship"); 
} 

回答

3

a)XML不屬於java代碼內部。把它放在同一個包中(如果你使用maven,最好在src/main/resources文件夾中)並將其作爲資源加載。

b)不要與XML進行字符串比較:做一個XML結構比較。 The canonicalizer是一個好主意。

0

我想你是在正確的軌道上 - 定義一個字符串常量「EXPECTED_XML」,只是斷言。

1

這比看起來更難 - 字符串比較肯定會失敗。這是因爲對於相同的實體至少

  • 不同的表示(&'等)
  • 不同訂單屬性的
  • 不同報價
  • 空白

最簡單的方法是在期望和測試中對XML進行canonicalise並對其進行比較。所有好的XML工具都應該有一個規範化器。

我不得不寫很多XML機制來支持我的單元測試 - 無可否認,它們包含浮點數,我必須考慮舍入錯誤。

但是比較字符串肯定會失敗。

+0

+1規範化器 – 2010-11-02 17:26:20

1

使用它們的字符串表示法比較2 XML是很危險的。事實上,你考慮以下XML:

<foo> 
    <bar>xxx</bar> 
    <baz>yyy</baz> 
</foo> 

等於:

<foo> 
    <baz>yyy</baz> 
    <bar>xxx</bar> 
</foo> 

如果是,那麼我建議您使用XMLUnit來測試您的當前XML與預期的一個。

關於預期的XML,最好的方法是將它們存儲爲外部文件,並在測試過程中加載它們(例如@BeforeClass代碼片段)。