[SPRING] jsonpath가있는 회원 수를 계산 하시겠습니까?
SPRINGjsonpath가있는 회원 수를 계산 하시겠습니까?
JsonPath를 사용하여 회원 수를 계산할 수 있습니까?
스프링 mvc 테스트를 사용하여 생성하는 컨트롤러를 테스트하고 있습니다.
{"foo": "oof", "bar": "rab"}
와
standaloneSetup(new FooController(fooService)).build()
.perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andExpect(jsonPath("$.foo").value("oof"))
.andExpect(jsonPath("$.bar").value("rab"));
나는 생성 된 json에 다른 멤버가 존재하지 않도록하고 싶습니다. 다행히 jsonPath를 사용하여 그것들을 세면됩니다. 가능한가? 대체 솔루션도 환영합니다.
해결법
-
==============================
1.배열의 크기를 테스트하려면 : jsonPath ( "$", hasSize (4))
배열의 크기를 테스트하려면 : jsonPath ( "$", hasSize (4))
객체의 멤버 수를 계산하려면 jsonPath ( "$. *", hasSize (4))
나. API가 4 개의 항목으로 구성된 배열을 반환하는지 테스트합니다.
허용 값 : [1,2,3,4]
mockMvc.perform(get(API_URL)) .andExpect(jsonPath("$", hasSize(4)));
API가 2 개의 멤버를 포함하는 객체를 반환하는지 테스트합니다.
허용 된 값 : { "foo": "oof", "bar": "rab"}
mockMvc.perform(get(API_URL)) .andExpect(jsonPath("$.*", hasSize(2)));
Hamcrest 버전 1.3과 Spring Test 3.2.5를 사용하고 있습니다.
hasSize (int) javadoc
노트 : hamcrest-library 의존성을 포함하고 정적 org.hamcrest.Matchers. *를 가져와야합니다. hasSize ()가 작동합니다.
-
==============================
2.오늘 나 자신을 다뤄 봤어. 이것은 사용 가능한 어설 션에서 구현 된 것처럼 보이지 않습니다. 그러나 org.hamcrest.Matcher 객체를 전달하는 방법이 있습니다. 이를 통해 다음과 같은 작업을 수행 할 수 있습니다.
오늘 나 자신을 다뤄 봤어. 이것은 사용 가능한 어설 션에서 구현 된 것처럼 보이지 않습니다. 그러나 org.hamcrest.Matcher 객체를 전달하는 방법이 있습니다. 이를 통해 다음과 같은 작업을 수행 할 수 있습니다.
final int count = 4; // expected count jsonPath("$").value(new BaseMatcher() { @Override public boolean matches(Object obj) { return obj instanceof JSONObject && ((JSONObject) obj).size() == count; } @Override public void describeTo(Description description) { // nothing for now } })
-
==============================
3.다음과 같이 size () 나 length ()와 같은 JsonPath 함수를 사용할 수 있습니다 :
다음과 같이 size () 나 length ()와 같은 JsonPath 함수를 사용할 수 있습니다 :
@Test public void givenJson_whenGetLengthWithJsonPath_thenGetLength() { String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}"; int length = JsonPath .parse(jsonString) .read("$.length()"); assertThat(length).isEqualTo(3); }
또는 단순히 net.minidev.json.JSONObject로 구문 분석하고 크기를 가져옵니다.
@Test public void givenJson_whenParseObject_thenGetSize() { String jsonString = "{'username':'jhon.user','email':'jhon@company.com','age':'28'}"; JSONObject jsonObject = (JSONObject) JSONValue.parse(jsonString); assertThat(jsonObject) .size() .isEqualTo(3); }
실제로, 두 번째 접근법은 첫 번째 접근법보다 더 나은 수행을 수행합니다. JMH 성능 테스트를 실시한 결과 다음과 같은 결과를 얻었습니다.
| Benchmark | Mode | Cnt | Score | Error | Units | |-------------------------------------------------|-------|-----|-------------|--------------|-------| | JsonPathBenchmark.benchmarkJSONObjectParse | thrpt | 5 | 3241471.044 | ±1718855.506 | ops/s | | JsonPathBenchmark.benchmarkJsonPathObjectLength | thrpt | 5 | 1680492.243 | ±132492.697 | ops/s |
예제 코드는 여기에서 찾을 수 있습니다.
-
==============================
4.클래스 경로에 com.jayway.jsonassert.JsonAssert가없는 경우 (나에게 해당), 다음과 같은 방법으로 테스트하면 해결할 수 있습니다.
클래스 경로에 com.jayway.jsonassert.JsonAssert가없는 경우 (나에게 해당), 다음과 같은 방법으로 테스트하면 해결할 수 있습니다.
assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());
[참고 : json의 내용은 항상 배열이라고 가정합니다.]
-
==============================
5.jsonpath 내부의 메소드를 사용할 수도 있습니다.
jsonpath 내부의 메소드를 사용할 수도 있습니다.
mockMvc.perform(get(API_URL)) .andExpect(jsonPath("$.*", hasSize(2)));
넌 할 수있어
mockMvc.perform(get(API_URL)) .andExpect(jsonPath("$.length()", is(2)));
from https://stackoverflow.com/questions/13745332/count-members-with-jsonpath by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 매개 변수가있는 JUnit SpringJUnit4ClassRunner를 실행하는 방법 (0) | 2019.03.01 |
---|---|
[SPRING] 평신도의 봄 전파 예제 (0) | 2019.03.01 |
[SPRING] 다중 모듈 스프링 구성은 어떻게합니까? (0) | 2019.03.01 |
[SPRING] PooledConnectionFactory 또는 CachingConnectionFactory가 더 좋습니다. (0) | 2019.03.01 |
[SPRING] 스프링 고정 관념의 장점? (0) | 2019.03.01 |