2017-11-20 7 views
0

JHipster-generated 스프링 부트 앱의 일부로 통합 JSON 객체가 특정 속성에 대해 null을 포함하는지 확인하기 위해 통합 테스트를 적용하려고합니다.스프링 부트 모의 REST API 통합 테스트 : JSON 응답에서 null 값 찾기

import static org.springframework.test.web.servlet.ResultActions.*; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 

.andExpect(jsonPath("$.selectedChannels[0].channelValue") 
    .doesNotExist()) 

이것은 작동하지 않습니다. 응답의 경우 :

java.lang.AssertionError: Expected no value at JSON path "$.selectedChannels[0].channelValue" but found: [null] 

내가 "doesNotExist"호출이 키가 존재하지 않음을 확인하려고한다고 가정

{ 
    "selectedChannels": [{ 
     "name": "test channel", 
     "channelValue": null 
    }] 
} 

나는 응답을 얻을 것입니다. Null 값과 함께 "value"도 사용하려고 시도했지만 NPE가 throw됩니다. 이 어설 션을 어떻게 성공적으로 수행합니까?

답변

0

Spring Framework (현재 스프링 부트 1.5.4 버전)에서 Null 값을 Null 값 하나와 함께 net.minidev.json.JSONArray로 렌더링하는 버그가있을 수 있습니다. 따라서 "channelValue": null"channelValue": [null]으로 렌더링됩니다. 이렇게하면 nullValue 정규 표현식이 작동하지 않습니다.

현재이 문제를 해결할 수있는 유일한 해결책은 내 자신의 Matcher를 구현하고 사용하는 것입니다. NullValue 정규 표현식을 템플릿으로 사용하면 다음과 같습니다.

import org.hamcrest.BaseMatcher; 
import org.hamcrest.Description; 
import org.hamcrest.Matcher; 
import net.minidev.json.JSONArray; 

/** 
* Matcher that can be used to detect if a value is null or refers to an empty list, 
* or a list that contains a single null value. 
* 
* @param <T> 
*/ 
public class IsNullOrEmpty<T> extends BaseMatcher<T> { 

    @Override 
    public boolean matches(Object item) { 
     System.out.println(item.getClass().getPackage()); 
     if(item instanceof JSONArray) { 
      JSONArray arr = ((JSONArray)item); 
      return arr==null || arr.size()==0 || (arr.size()==1 && arr.get(0)==null); 
     } 
     return item==null; 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText("null or list of null"); 
    } 

    /** 
    * Detect if the value is null or contains an empty array, or an array of a single element 
    * of null 
    * @return 
    */ 
    public static Matcher<Object> isNullOrEmpty() { 
     return new IsNullOrEmpty<>(); 
    } 

} 
1

JSON 경로 일치 자 doesNotExist()은 키가 없음을 주장하는 데 사용됩니다. 예를 들어, channelValue 키가 있기 때문에 어설 션이 실패합니다. JsonPathResultMatchers doesNotExist()에 대한 참조 공식 Javadoc과 (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/web/servlet/result/JsonPathResultMatchers.html#doesNotExist--) :

는 응답 내용에 대한 JSON 경로 식을 평가 값이 주어진 경로에 존재하지 않는다고 주장한다.

당신이 응답이 키 channelValue에 대한 null 값이 포함 된 경우 확인 귀하의 제공 응답을 원하는 : import static org.hamcrest.Matchers.nullValue;

:

resultActions.andExpect(jsonPath("$.selectedChannels[0].channelValue").value(nullValue()); 

하는 정규) (Hamcrest에 nullValue에 대한 정적 가져 오기를 추가 할 수 있는지 확인을

+0

언급 한 라이브러리에서 언급 한'nullValue '에 대한 정적 메서드가 표시되지 않습니다. 나를 적당한 위치로 안내 할 수 있니? – IcedDante

+0

JHipster 응용 프로그램에 이미 포함되어있는 Hamcrest 정규직입니다. import static import org.hamcrest.Matchers.nullValue; – Tom

+0

아, 그 특정 매처가 작동하지 않습니다. org.hamcrest.core.IsNull.nullValue()는 응답을 반환합니다 : 예상 : null이지만 :은 <[null]>입니다. Spring의 JsonPathResultMatchers는 어떤 이유로 null을 null 목록으로 캐스팅하고 있습니다. – IcedDante