Преобразование символов в UTF-8 - PullRequest
2 голосов
/ 11 февраля 2011

В моем модульном тесте я пытаюсь доказать, что ответы 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>

Что я здесь не так делаю? Спасибо

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Если 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, так что фактическое кодирование применяется в представлении после генерации атрибутов модели.

Смотри также:

1 голос
/ 11 февраля 2011

[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().

...