2016-10-19 6 views
0

내 JUnit 테스트 중 하나는 Woodstox 파서를 사용합니다.Woodstox 파서는 Eclipse에서 실행되는 테스트에서 정상적으로 작동하지만 명령 줄에서는 실패합니다.

Eclipse에서 테스트를 실행하면 예상대로 테스트가 성공합니다.

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) 

내가하려면-수에서 살펴 보았다 : 다음과 같은 예외 메시지와 함께 실패 테스트에

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

결과를 사용하여

그러나 명령 줄에서 동일한 테스트를 실행

, -parsed InputStream. InputStream은 두 경우 모두 동일합니다.

또한 InputStream에는 "line 114 column 21"이 없습니다. 114 번 줄은 11 번 열로 끝납니다.

어떻게 다른 행동을 일으키는 지 조사 할 수 있습니까?

답변

0

내가 사용하는 라이브러리가 환경의 기본 문자 인코딩 (라고도하는 플랫폼의 기본 문자 집합)에 대해 잘못된 가정을 한 것으로 나타났습니다. 명령 줄 환경에서이 CP1252을 반환하면서 Charset.defaultCharset()를 호출 Eclipse 환경에서

UTF-8를 반환했습니다.

많은 표준 및 타사 자바 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)
: 명시 적으로 올바른 문자 집합을 사용하는 라이브러리를 업데이트