2017-09-14 2 views
1

JSON 문서를 서비스에 제출하는 웹 서비스 클라이언트에 대해 JUnit 테스트를 작성했습니다.assertEquals를 사용하여 비교할 때 동일한 JSON 문자열이 같지 않음

"올바른"JSON 문서를 파일에 저장 한 후 테스트 실행 후 실제 결과와 비교합니다.

라인이 동일하지만 그들은 일치하지 :

org.junit.ComparisonFailure: 
    Expected :{"Callback":null,"Data": 
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}} 
    Actual :{"Callback":null,"Data": 
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}} 

라인에 대한 4K 문자, 매우 긴, 그래서 여기의 많은 부분을 잘라하지만, 그 길이는 동일하다. 나는 디버거에서 string.size()를 비교하고, 최종적으로 텍스트 편집기가 암시 적으로 삽입 할 수있는 보이지 않는 공백 심볼을 제거하기 위해 비교하기 전에 트림합니다.

또한 테스트는 독립적으로 실행하면 정상입니다. 하지만 더 큰 스위트 룸의 일부로 실행하면 실패합니다.

전역/정적 변수가 없으므로 메모리 무시가 문제가되지 않아야합니다. 나는이 같은 요청 문자열을 추출하는 웹 서비스 클라이언트를 조롱하고 있습니다 :

StringBuilder pd = new StringBuilder(); 
doAnswer((invocation) -> { 
    String postDocument = ((String)invocation.getArguments()[0]).trim(); 
    pd.append(postDocument); 
    return null; 
}).when(client).doPost(anyString(), anyObject()); 

클라이언트가 조롱 클래스입니다.

은 그럼 문자열의 버전을 손질 비교하지만 문제는 JSON 사양 자체입니다 :-) 자신을 대답 발견

String expectedSubmit = TestUtils.readXmlFromFile("strategyexecution\\ireland_bm_strategy_override_expected.json").trim(); 
assertEquals(expectedSubmit, pd.toString().trim()); 
+0

인코딩 문제 일 수 있습니까? 문자열을 별도의 파일에 기록하고 md5 또는 sha1 체크섬을 사용하여 실제 바이트가 동일한 지 확인할 수 있습니다. – inovaovao

+4

[mcve]를 게시하십시오. assertEquals가 깨지지 않았습니다 –

+0

Jenkins env에서 잘 실행됩니다. IntelliJ IDEA의 버그처럼 보입니다. IDEA에서만 실패하고 전체 스위트 (하나의 클래스 파일에서 분리 된 테스트가 아닌)가 실행될 때만 실패합니다 –

답변

1

가 도움이 나던. JSON은 배열 내부에서 동일한 순서의 요소를 보장 할 수 없으며 기본적으로 순서가 설정되어 있지 않습니다. 따라서 콘텐츠를 임의로 재정렬 할 수 있습니다. 두 개의 JSON 파일을 두 개의 문자열로 비교해서는 안됩니다.

Java 객체와 객체 비교 작업을 역 직렬화했습니다!

0

이전 문제는 XML과 동일합니다. XML의 경우 XMLUnit이고 의미 적으로은 xml-s를 비교합니다. JSON의 경우 JsoNunit과 같은 유사한 도구를 사용하려고합니다. JSONAssert도 유망 해 보인다.