2011-07-25 66 views
1

我有一個函數,其中包含一個ODataObject,其中包含來自消息總線觸發事件的一些XML。我正在編寫測試用例來檢查我的函數如何處理來自僅包含以下內容的消息總線的XML:<?xml version="1.0" encoding="UTF-8"?>從XML字符串創建節點而不使用解析

這是我如何創建一個被傳遞給我的其他測試用例

final Document document = DOMUtil.parse(TestEventXML) 
final DataObject dataObject = new ODataObject(document.getDocumentElement()) 
myListener.onMessage(dataObject) 

然而,數據對象,在上面的字符串傳遞爲TestEventXML返回此錯誤:

java.lang.NullPointerException: Cannot invoke method getDocumentElement() on null object 

因爲對格式錯誤的XML字符串調用DOMUtil.parse()將返回空值。

所以,我需要一些解決方法,這將允許我創建一個org.w3c.dom.Node,我可以將其傳遞到ODataObject的構造函數中,這是我創建的XML字符串中的一個。任何想法,建議等將不勝感激。

編輯 - 問題

澄清的總結,我知道,我想傳遞的字符串就是沒有內容的XML文件的標題。但有時候這就是通過消息總線發生的事情,所以我需要測試我的函數是否正確處理它。我的函數確實有處理格式錯誤的XML的代碼,所以我的問題不是如何檢查XML是否格式錯誤。問題是我需要創建一個DataObject來測試我正確處理它。但是我不能使用格式不正確的XML創建一個DataObject,因爲解析返回null。

EDIT 2 - 如何我目前正在處理畸形/空XML

在我onMessage功能,我呼籲傳入數據對象,它返回的數據對象的XML字符串的方法toString。然後,要創建一個groovy.util.Node對象,我嘗試new XmlParser().parseText(xmlString)並捕獲所有由SAXParseExcetions導致的XML格式錯誤或爲空。 onMessage函數剛剛返回,跳過該函數其餘部分的所有解析代碼。

附錄 - 這可能會回答我原來的問題
org.w3c.dom.Node另一個問題是一個接口,所以我不能只是做new 0DataObject(new Node())。有沒有辦法創建一個節點,並將正確的屬性設置爲我的XML字符串?

請對任何問題發表評論。

+1

這似乎是一個測試場景......當在實際的程序流程中,您的偵聽器是由一個由近乎空XML形成的「ODataObject」觸發時會發生什麼?也許你想看看'ODataObject'是如何構造的,並着眼於找到一種方法來手動構造'ODataObject',而不是'Node'。 (也許我在回答中引導你錯誤地注意到'Node'--對不起!) –

+0

我想,將來我可能會研究這個。目前,我發現了一個使用Groovy的'MockFor'類的修復程序。我對「ODataObject」做了一個模擬,傳入格式正確的XML,然後攔截'toString'函數返回格式錯誤的XML。不漂亮,但它現在工作。 –

回答

2

修復工作:使用Groovy的MockFor類來創建一個ODataObject的模擬。在創建DataObject時,我傳遞格式正確的XML。但是,當ODataObjecttoString函數被調用時,我會攔截它並返回格式錯誤的XML。

我會試着查看Platinum Azure的建議,看看我正在偵聽的消息總線如何構造ODataObject,以確定它爲什麼返回<?xml [...]>字符串。

+0

因爲這是一個測試場景,所以我應該首先建議嘲笑。杜爾。 –

+0

哈哈。好吧,無論如何,我感謝你的幫助。 :) –

1

我可能是錯的,但我覺得你想解決錯誤的問題。我想我不確定爲什麼你不能手動構建節點,或者甚至爲什麼當你知道XML是不好的時候需要構建節點。

如果您正在等待有關消息總線的更多信息,並且您對輸入數據的模式有控制權,那麼您可能應先發送一個內容長度,然後再嘗試等待那麼多數據做XML解析工作?由於XML是一種基於平衡節點的上下文無關語法,因此嘗試在內存中構建一個XML文檔並不是每個最後一個字節,包括關閉根標記都不是一個好主意。

否則,如果您只需要處理空值,請考慮使用null object pattern

+0

你是什麼意思「手動構建節點」? 我無法控制消息總線的功能。有時它會創建一個DataObject,其中包含的XML只是標題。我同意這樣做沒有道理,但我認爲在目前的情況下,我可以建議他們改變這個框架。 我將編輯帖子,提及我目前處理格式錯誤/空XML的方式。 –

+0

我對你嘗試使用的庫(或者Java或Groovy)知之甚少,但我基本上意味着新增和設置屬性。 :-P對於我所知道的,可能沒有辦法做到這一點,在這種情況下,你必須回頭改變傳入的數據流(如果你有控制權)或其他東西。 –

+0

是的,我不確定我在節點上設置哪個屬性,我想這是我的問題的一部分。 –