2017-12-08 22 views
0

UI에 표시 될 JSON 객체를 반환하는 API가 있습니다. UI에서 필드를 순서대로 표시하려고하므로 객체의 필드 순서가 중요합니다. 개체의 필드 순서가 올바른지 확인하기 위해 단위 테스트를 작성하고 싶습니다. 위, 분명히JSONPath 표현식의 Matcher로 필드 순서를 찾습니다.

.andExpect(jsonPath("$.data"), is("field1=value1, field2=value2") 

: 봄 부팅의 MockMvc 라이브러리를 사용하여

{ 
    "data": { 
     "field1": "value1", 
     "field2": "value2" 
    } 
} 

, 나는 필드가 순서대로 돌아 오는 것을 확인하기 위해이 같은 표현을 쓰고 싶은 : 내 API 응답은 다음과 같습니다 작동하지 않지만 어떤 유형의 Matcher을 사용해야 필드를 순서대로 검사해야하는지 확신 할 수 없습니다.

답변

0

필드의 순서를 비교하는 Hamcrest 정규식을 찾을 수는 없지만 직접 작성할 수는 있습니다. JSON 경로 표현식의 결과는 LinkedHashMap이 될 것이므로 LinkedHashMap을 가져 와서 지정된 객체와 항목을 순서대로 비교하는 Matcher 만 필요합니다. 지도를 List으로 변환하고 방법을 사용하면 List이라는 트릭을 사용하므로 List부터 순서대로 항목을 비교합니다.

private class OrderedMapMatcher extends BaseMatcher<Map<String, String>> { 

    private LinkedHashMap<String, String> expected; 

    public OrderedMapMatcher(LinkedHashMap<String, String> expected) { 
     this.expected = expected; 
    } 

    @Override 
    public boolean matches(Object o) { 
     if (!(o instanceof LinkedHashMap)) { 
      return false; 
     } 
     LinkedHashMap actual = (LinkedHashMap) o; 
     List<Map.Entry<String, String>> expectedList = new ArrayList<>(expected.entrySet()); 
     List actualList = new ArrayList(actual.entrySet()); 
     return expectedList.equals(actualList); 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText(expected.toString()); 
    } 
} 

그리고 여기에 주장 보이는 방법은 다음과 같습니다 : 여기

는 정규 보이는 방법

LinkedHashMap<String, String> expectedData = new LinkedHashMap<>(); 
expectedData.put("field1", "value1"); 
expectedData.put("field2", "value2"); 

// mockMvc ResultActions code would be here 
.andExpect(jsonPath("$.data", new OrderedMapMatcher(expectedData)));