2017-11-22 25 views
1

저는 스프링과의 통합 테스트를 작성하고 있습니다. 응답의 json이 필요한 모든 데이터를 포함하고 있는지 확인하고 싶습니다. 참조 코드 :Spring JsonPath는 어떤 순서로든 예외를 포함합니다.

@Test 
public void getAll() throws Exception { 
    String url = "/permissions/all"; 
    int size = 4; 
    try { 
     Set<String> permissions = RandomGenerator.randomStrings(size); 
     initDb(permissions); 
     mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
       .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
       .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions))); //exception 
    } finally { 
     dropDb(); 
    } 
} 

그러나 내가 여기에 예외를 받고 있어요 :

java.lang.AssertionError: JSON path "$[?(@.name)].name" 

Expected: iterable over [<[b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675, 7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42, 7df2fa88-b22f-4d33-91b2-f8b00813522f, 17b61119-c48c-4dff-ac9c-047eb3efcc43]>] in any order 
but: Not matched: "7df2fa88-b22f-4d33-91b2-f8b00813522f" 

그리고이 응답의 데이터 :

[{ 
    "id": 1, 
    "name": "7df2fa88-b22f-4d33-91b2-f8b00813522f" 
}, { 
    "id": 2, 
    "name": "b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675" 
}, { 
    "id": 3, 
    "name": "7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42" 
}, { 
    "id": 4, 
    "name": "17b61119-c48c-4dff-ac9c-047eb3efcc43" 
}] 

내가 아는, $[?(@.name)].name 잘 작동하는 선택을하고, 다음 결과를 반환합니다.

[ 
    "7df2fa88-b22f-4d33-91b2-f8b00813522f", 
    "b0ce9e8a-8b62-41f4-91b9-d9cf6ff96675", 
    "7ebe3a4f-7864-4ea5-92b3-a5ad6f44bf42", 
    "17b61119-c48c-4dff-ac9c-047eb3efcc43" 
] 

permissions 세트도 정확하며 위의 샘플과 같이 4 개의 문자열을 포함합니다.

누군가 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까?

Set<String> permissions = RandomGenerator.randomStrings(size); 
initDb(permissions); 
mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
    .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
    .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions.toArray(new String[permissions.size()])))); 

또는 재 작성 :

답변

2

이 작동 여기

String[] permissions = RandomGenerator.randomStrings(size); 
initDb(permissions); 
mvc.perform(get(url).with(Users.PERMISSIONS_READ)) 
    .andExpect(jsonPath("$[?(@.name)].name", hasSize(size))) //ok 
    .andExpect(jsonPath("$[?(@.name)].name").value(containsInAnyOrder(permissions))); 

containsInAnyOrder의 서명입니다 : 그래서

public static <T> Matcher<Iterable<? extends T>> containsInAnyOrder(T... items) 

, 그것은 같은 유형의 가변 인자를 기대 당신이 주장하고있는 귀하의 경우에는 String 유형에 대해 주장하지만 Set<String>containsInAnyOrder으로 제공하므로 문자열과 세트 간의 일치가 실패합니다.

+0

감사합니다. 예, 작동합니다. –