2011-02-11 41 views
0

在我的單元測試中,我試圖證明發送到客戶端應用程序的HTTP響應僅包含有效的UTF-8字符。這是因爲英鎊符號'£'沒有作爲UTF-8編碼字符發送,導致客戶端應用程序驗證失敗的問題。將字符轉換爲UTF-8

在我的測試我做了以下內容:

 
// setup 
byte[] outputData = "£".getBytes("ISO-8859-1"); 
String serviceXmlResponse = String.format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>%s</some>", outputData.toString()); 
String expectedXmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>"; 
when(service.getMessage()).thenReturn(serviceXmlResponse); 

// act 
ModelAndView result = controller.handlePostRequest(request, response, mav); 

// assert 
assertEquals(expectedXmlContent, result.getModel().get(ApplicationController.RESPONSE_KEY)); 

生成的XML包含:

 
<?xml version="1.0" encoding="utf-8" ?><some>[[email protected]</some> 

我在做什麼錯在這裏? 謝謝

+0

調用`的ToString()`字節數組上沒有做什麼,你認爲它。無論如何,你爲什麼要把`£`轉換成字節數組? – 2011-02-11 11:14:26

+0

這是造成問題的符號,可能是由於原生的,即承載應用程序的機器上的ISO8859-1編碼。該應用程序本質上是中間件,充當服務之間的代理。 – DrPep 2011-02-11 11:21:49

回答

1

[B是您在byte陣列上致電toString()時得到的結果。

所以你的測試不起作用,因爲它基本上是這樣說的:「當調用getMessage()時返回預期的輸出」。所以它測試assertEquals (expected, expected);

您的問題是在從套接字讀取XML字節的代碼,然後把它們轉換成由service.getMessage()

返回所以你的代碼必須看起來像一個字符串:

String expectedXmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>"; 
byte[] data = expectedXmlContent.getBytes("UTF-8"); 

... send data to service as byte stream ... 

assertEquals(expectedXmlContent, service.getMessage()); 

也不要混合編碼;如果XML表示「UTF-8」,那麼您必須在getBytes()中使用相同的編碼。

2

如果service.getMessage()返回你的XML作爲String,而result.getModel().get(ApplicationController.RESPONSE_KEY)返回相同的XML編碼形式爲byte[],您的測試應該是這樣的:

String serviceXmlResponse = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>"; 
when(service.getMessage()).thenReturn(serviceXmlResponse); 

assertArrayEquals(serviceXmlResponse.getBytes("UTF-8"), (byte[]) result.getModel().get(ApplicationController.RESPONSE_KEY)); 

否則你的測試並沒有太大的意義,特別是如果result.getModel().get(ApplicationController.RESPONSE_KEY)返回String,以便在生成模型屬性之後在視圖中應用實際編碼。

參見: