2011-02-11 43 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,以便在生成模型属性之后在视图中应用实际编码。

参见: