인프런 커뮤니티 질문&답변

shihi님의 프로필 이미지
shihi

작성한 질문수

스프링 기반 REST API 개발

REST API 개발 중 비즈니스 로직 적용 부분의 JSON 에러

해결된 질문

작성

·

55

0

아래와 같이 perform 과정에서 validator -> serialize로 넘어가는 부분에서 json 이 eventDTO를 찾을 수 없다는 에러가 발생하여 json을 직렬화할 수 없어서 error 메시지가 반환되지 않아 test 실패가 나타나는 것 같습니다. 혹시 버전 차이로 인해 필요한 어노테이션이나 함수가 달라져 발생하는 문제일까요? 관련하여 검색해도 답안을 찾기 어려워서 질문 드립니다. 감사합니다.

Inconvertible types; cannot cast 'org.example.springrestproject.Events.EventControllerTests' to 'org.springframework.test.util.JsonPathExpectationsHelper'


No value at JSON path "$[0].objectName"

java.lang.AssertionError: No value at JSON path "$[0].objectName"

at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:302)

at org.springframework.test.util.JsonPathExpectationsHelper.assertExistsAndReturn(JsonPathExpectationsHelper.java:326)

at org.springframework.test.util.JsonPathExpectationsHelper.exists(JsonPathExpectationsHelper.java:190)

at org.springframework.test.web.servlet.result.JsonPathResultMatchers.lambda$exists$3(JsonPathResultMatchers.java:123)

at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)

at org.example.springrestproject.Events.EventControllerTests.createEvent_Bad_Request_Wrong_Input(EventControllerTests.java:149)

at java.base/java.lang.reflect.Method.invoke(Method.java:568)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

Caused by: java.lang.IllegalArgumentException: json can not be null or empty

at com.jayway.jsonpath.internal.Utils.notEmpty(Utils.java:401)

at com.jayway.jsonpath.JsonPath.read(JsonPath.java:390)

at com.jayway.jsonpath.JsonPath.read(JsonPath.java:377)

at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:299)

... 8 more

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. shihi님.

강의 중 발생한 JSON 관련 오류로 인해 테스트가 실패하는 부분에 대한 질문을 주셔서 감사합니다.

해당 에러는 JsonPath를 통해 특정 경로의 값을 참조하려다 발생하는 것으로 보입니다. 정확한 원인을 파악하기 위해선 아래 두 가지 항목을 점검해 보시는 것이 좋습니다.

  1. MediaTypeAccept 설정:
    기본적으로 Spring 프로젝트에서 MediaType.APPLICATION_JSON 대신 MediaType.APPLICATION_JSON_UTF8를 사용할 때 문제가 발생할 수 있습니다. 이를 해결하려면 컨트롤러와 테스트 코드에서 미디어 타입을 맞춰주는 것이 중요합니다.

  2. JsonPath, Enum 및 직렬화 문제:
    JsonPath를 사용해 JSON 데이터를 검증할 때 Enum 타입의 값을 문자열로 비교해야 할 때가 있습니다. 이때, enum 값을 바로 비교하면 타입 불일치 오류가 발생할 수 있습니다.

관련된 문제로 도움이 될 만한 유사한 질문과 답변들을 링크해드리니, 확인해보시길 추천드립니다.

관련 질문 및 답변

  • 테스트시 enum 값 불일치

    • 주요 내용: JsonPath를 통해 Enum 값을 비교할 때 문자열로 변환하여 비교하는 방법과 Enum 타입의 JSON 직렬화를 다루는 방법에 대한 설명이 포함되어 있습니다.
  • ErrorResource 추가후 발생되는 에러

    • 주요 내용: 스프링 부트 버전 업그레이드와 JSON 직렬화/역직렬화 과정에서 발생할 수 있는 이슈 다루기, ErrorsResource 설정법 등에 대해 설명하고 있습니다.
  • 인덱스 만들기-ErrorsResource 부분 질문

    • 주요 내용: ErrorsResource 사용 시 JSON 파싱 오류를 해결하는 방법이 담겨있습니다. JsonSerializer에 특정 필드명을 추가하고, 테스트 코드에서 해당 필드명으로 체크하는 방법을 설명하고 있습니다.

추가 설명 및 해결 방법

  • 이유: 제공된 JSON 경로가 잘못되었거나 존재하지 않는 경우 발생할 수 있습니다. 예를 들어, eventDTO 객체에 objectName 필드가 존재하지 않는 상황일 수 있습니다.
  • 해결 방법: producesHAL_JSON_VALUE를 설정해보시고, 테스트 코드에서 모델 객체를 objectMapper로 직렬화하여 쿼리에 포함시키는 것을 확인해보세요.

현재 에러 메시지와 상황을 종합해보면, JsonPath를 적절하게 사용하고 있는지, 그리고 미디어 타입 설정이 맞는지 주의깊게 살펴보는 것이 중요합니다. 각 코드를 세밀하게 검토하고 필요한 타입 변환을 확실히 해준다면, 오류를 해결하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

shihi님의 프로필 이미지
shihi

작성한 질문수

질문하기