복붙노트

[SPRING] jsonpath가있는 회원 수를 계산 하시겠습니까?

SPRING

jsonpath가있는 회원 수를 계산 하시겠습니까?

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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.클래스 경로에 com.jayway.jsonassert.JsonAssert가없는 경우 (나에게 해당), 다음과 같은 방법으로 테스트하면 해결할 수 있습니다.

    클래스 경로에 com.jayway.jsonassert.JsonAssert가없는 경우 (나에게 해당), 다음과 같은 방법으로 테스트하면 해결할 수 있습니다.

    assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());
    

    [참고 : json의 내용은 항상 배열이라고 가정합니다.]

  5. ==============================

    5.jsonpath 내부의 메소드를 사용할 수도 있습니다.

    jsonpath 내부의 메소드를 사용할 수도 있습니다.

    mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$.*", hasSize(2)));
    

    넌 할 수있어

    mockMvc.perform(get(API_URL))
       .andExpect(jsonPath("$.length()", is(2)));
    
  6. from https://stackoverflow.com/questions/13745332/count-members-with-jsonpath by cc-by-sa and MIT license