在我的单元测试中,我试图证明发送到客户端应用程序的HTTP响应只包含有效的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>[B@1164b9b6</some>
我在这里做错了什么? 感谢
答案 0 :(得分:2)
如果service.getMessage()
将您的XML作为String
返回,而result.getModel().get(ApplicationController.RESPONSE_KEY)
以byte[]
的编码形式返回相同的XML,则您的测试应如下所示:
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
,那么在生成模型属性后,视图中会应用实际编码。
另见:
答案 1 :(得分:1)
[B
是您在toString()
数组上致电byte
时获得的。
所以你的测试不起作用,因为它基本上说:“调用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()
中使用相同的编码。