2016-10-19 9 views
0

Один из моих тестов JUnit использует (за кулисами) парсер Woodstox.Парсер Woodstox отлично работает в тестовом прогоне в Eclipse, но выходит из командной строки

Когда я запускаю тест из Eclipse, тест проходит успешно, как и ожидалось.

Но работает тот же тест в командной строке, используя

mvn clean test -Dtest=com.example.MyClassTest#someParserTest 

результаты в тесте на неудачу со следующими сообщениями исключения:

Error on line 114 column 21 
    SXXP0003: Error reported by XML parser: Invalid UTF-8 middle byte 0x3f (at char #4174, byte #3999) 
    ... 
    at com.ctc.wstx.io.UTF8Reader.reportInvalidOther(UTF8Reader.java:314) 
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:205) 
    at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84) 
    at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:55) 
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:961) 
    at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4580) 
    at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3657) 
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1063) 
    at com.ctc.wstx.sax.WstxSAXParser.fireEvents(WstxSAXParser.java:524) 
    at com.ctc.wstx.sax.WstxSAXParser.parse(WstxSAXParser.java:452) 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:440) 
    at net.sf.saxon.event.Sender.send(Sender.java:171) 
    at net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:363) 

Я посмотрел на, чтобы быть -parsed InputStream. InputStream s идентичны в обоих случаях.

Кроме того, в колонке InputStream нет «строки 114 линии». Линия 114 заканчивается на колонке 11.

Как я могу исследовать причину различного поведения?

ответ

0

Оказалось, что библиотека, которую я использовал, делала неправильные предположения о кодировке символов по умолчанию (также называемой стандартной кодировкой платформы).

В среде затмений, вызывая Charset.defaultCharset()вернулся UTF-8, в то время как в среде командной строки она вернулась CP1252.

Многие стандартные и третьей стороной Java API, ведут себя по-разному в зависимости от по умолчанию кодировкой платформы, среди них:

  • String.getBytes()
  • ByteArrayOutputStream.toString()
  • XMLOutputFactory.createXMLStreamWriter(OutputStream stream)
  • IOUtils.toString(InputStream input)

Для решить мою проблему, мне пришлось обновить эту библиотеку явно использовать правильный набор символов:

  • String.getBytes(StandardCharsets.UTF_8)
  • ByteArrayOutputStream.toString(StandardCharsets.UTF_8.name())
  • XMLOutputFactory.createXMLStreamWriter(OutputStream stream, StandardCharsets.UTF_8.name())
  • IOUtils.toString(InputStream input, StandardCharsets.UTF_8)