상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - JUnit에서 JSON 응답을 검증하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
JUnit에서 JSON 응답을 검증하는 방법은 여러 가지가 있으며, 주로 REST API 테스트나 JSON 데이터 응답이 올바른지 확인할 때 사용됩니다. 기본적으로 JUnit만으로는 JSON 구조나 값을 직접 비교하기 어렵기 때문에 JSON을 파싱하고 비교할 수 있는 라이브러리와 함께 사용하는 것이 일반적입니다. 다음은 JSON 응답을 검증하는 대표적인 방법과 절차를 자세히 설명합니다. 1. JUnit과 JSON 파싱 라이브러리 준비하기 JUnit만으로는 JSON 문자열을 의미 있게 처리하거나 비교하기 어렵기 때문에, 보통 다음과 같은 라이브러리를 함께 활용합니다. - Jackson (`com.fasterxml.jackson.databind.ObjectMapper`) JSON 문자열을 Java 객체로 변환하거나 JSON 노드 트리로 파싱 가능. - Gson (Google's JSON library) 마찬가지로 JSON을 Java 객체로 변환하거나 JsonElement 형태로 다룰 수 있음. - JSONassert (org.skyscreamer.jsonassert.JSONAssert) JSON 문자열 간의 비교에 특화되어 있으며, 값과 구조를 정확히 검사할 수 있음. - AssertJ JSON (org.assertj.core.api.Assertions) AssertJ 라이브러리의 확장으로 JSON 응답을 유연하게 검증 가능. 2. 대표적인 JSON 응답 검증 방법 1) Jackson의 JsonNode를 이용한 구조 및 값 검사 - JSON 문자열을 `ObjectMapper`의 `readTree()` 메서드로 `JsonNode` 객체로 파싱함. - `JsonNode`는 트리 구조이기 때문에, 필드 값이나 배열 요소 등을 쉽게 탐색 가능함. - JUnit `assertEquals`, `assertTrue` 등과 결합하여 특정 필드 존재 여부, 값 일치 여부를 검사. ```java ObjectMapper mapper = new ObjectMapper(); JsonNode actualJson = mapper.readTree(actualJsonString); JsonNode expectedJson = mapper.readTree(expectedJsonString); // 전체 구조 및 값 비교 assertEquals(expectedJson, actualJson); // 특정 필드 값 검사 assertEquals("John", actualJson.get("name").asText()); // 배열 길이 검사 assertEquals(3, actualJson.get("items").size()); ``` 2) JSONassert를 통한 문자열 기반 JSON 비교 - `JSONAssert.assertEquals(expected, actual, boolean strict)`를 사용해 두 JSON 문자열을 비교 - `strict` 옵션이 `true`이면 배열 순서 및 전체 구조가 일치해야 하고, `false`이면 일부 값만 검사 가능 - 내부적으로 JSON 문자열을 파싱하여 구조와 값을 비교하므로 편리함 ```java import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; String expectedJson = "{\"name\":\"John\", \"age\":30}"; String actualJson = "{\"age\":30, \"name\":\"John\"}"; // 순서 무시(strict=false) assertEquals(expectedJson, actualJson, false); ``` 3) Gson의 JsonElement를 활용한 비교 - Gson의 `JsonParser.parseString()`로 `JsonElement` 객체를 생성 - `equals()` 메서드로 전체 JSON 트리를 비교함으로써 동일성 검증 가능 ```java JsonElement expected = JsonParser.parseString(expectedJsonString); JsonElement actual = JsonParser.parseString(actualJsonString); assertEquals(expected, actual); ``` 4) AssertJ JSON을 이용한 유연한 검증 - AssertJ JSON 확장 라이브러리를 의존으로 추가 후 `assertThatJson()` 메서드를 사용 - JSON 내 특정 필드의 값, 경로, 배열 크기 등을 직관적이고 가독성 있게 검증 가능 ```java import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; String actualJson = "..."; assertThatJson(actualJson) .node("user.name").isEqualTo("John") .node("user.age").isNumber() .node("user.items").isArray() .node("user.items.length()").isEqualTo(3); ``` 3. 테스트 작성시 고려사항 - 정확한 기대값 준비 : 기대하는 JSON 구조와 값이 명확해야 테스트 신뢰도 상승. - 부분 검사 vs 전체 검사 : 전체 JSON을 엄격히 비교할 수도, 특정 중요한 필드만 선별적으로 검사할 수도 있음. - 배열 순서 고려 여부 : API 응답이 배열 순서를 보장하는지 여부에 따라 strict 옵션 등 설정 변경. - Null 값 처리 및 필드 존재 여부 검사 : 필드가 반드시 존재해야 하는지, 값이 null일 수 있는지 명확히 해야 함. - 포맷 차이 무시 : 공백, 줄바꿈 등 포맷 차이로 인한 비교 실패를 방지할 방법을 쓴다(ex: JSONassert는 자체 파싱 후 비교). 4. 예시 JUnit 테스트 코드 ```java import static org.skyscreamer.jsonassert.JSONAssert.assertEquals; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; public class JsonResponseTest { String actualJson = "{\"name\":\"John\", \"age\":30, \"items\": [\"a\", \"b\", \"c\"]}"; String expectedJson = "{\"age\":30, \"items\": [\"a\", \"b\", \"c\"], \"name\":\"John\"}"; @Test public void testJsonEqualsUsingJsonAssert() throws Exception { // 순서 무시하여 내용만 검사 assertEquals(expectedJson, actualJson, false); } @Test public void testJsonNodeComparison() throws Exception { ObjectMapper mapper = new ObjectMapper(); JsonNode expected = mapper.readTree(expectedJson); JsonNode actual = mapper.readTree(actualJson); // 전체 JsonNode 비교 assertEquals(expected, actual); // 특정 값 검증 assertEquals("John", actual.get("name").asText()); assertEquals(3, actual.get("items").size()); } } ``` --- 요약 - JUnit 자체는 JSON 검증에 한계가 있어 Jackson, Gson, JSONassert 같은 JSON 파싱 및 비교 라이브러리와 함께 사용하면 효과적임. - 전체 JSON 문자열 비교, 특정 필드 및 값 검증, 배열 길이나 존재 여부 확인 등을 다양한 방법으로 구현 가능. - 테스트 목적에 따라 엄격한 비교(strict) 또는 일부 필드만 검사하는 유연한 방식을 선택하여 활용하면 됨. - JSONassert는 JSON 문자열 비교에 간편하고 유용하며, Jackson을 이용해 `JsonNode`로 변환 후 세밀한 필드 검사도 자주 쓰임. 이처럼 JUnit과 JSON 관련 라이브러리를 조합해 JSON 응답을 효율적이고 신뢰성 있게 검증할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기