2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

JUnit에서 REST API를 테스트하는 방법은?

_____
Q1: JUnit에서 REST API를 테스트하려면 어떤 도구를 사용해야 하나요?
A1: JUnit 단독으로는 REST API 호출 및 검증 기능이 제한적이므로, 보통 `Spring Boot Test`의 `MockMvc`, `RestTemplate`, `WebTestClient`, 또는 외부 라이브러리인 `RestAssured` 등을 함께 사용합니다.

---

Q2: Spring 환경에서 REST API를 JUnit으로 쉽게 테스트하는 방법은?
A2: Spring Boot를 사용할 경우 `@SpringBootTest`와 `@AutoConfigureMockMvc` 애노테이션을 함께 사용해 `MockMvc` 객체를 주입받아 API 엔드포인트를 비동기 호출하고 응답을 검증할 수 있습니다.

예)
```java
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;

@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John"));
}
}
```

---

Q3: MockMvc 말고 어떤 방법이 있나요?
A3:
- `TestRestTemplate`: Spring Boot에서 통합 테스트 시 실제 서버 같이 동작하는 API를 호출할 때 편리합니다.
- `WebTestClient`: 주로 WebFlux(비동기 웹) 환경에서 비동기/반응형 API 테스트 시 사용합니다.

---

Q4: RestAssured란 무엇인가요?
A4: REST API 테스트를 위한 Java DSL(도메인 특화 언어) 라이브러리입니다. 문법이 직관적이며 JSON 파싱 및 검증에 강력합니다. JUnit과 같이 사용해 외부 서비스 또는 서버를 띄운 상태에서 API를 테스트할 때 자주 활용됩니다.

예)
```java
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

@Test
public void testGetUser() {
given().
baseUri("http://localhost:8080").
when().
get("/users/1").
then().
statusCode(200).
body("name", equalTo("John"));
}
```

---

Q5: API 응답 데이터(JSON 등)를 검증하는 팁이 있나요?
A5:
- `MockMvc`에서는 `jsonPath()` 메서드를 활용해 JSON 필드 값을 검증합니다.
- `RestAssured`도 `body()`와 `Matchers`를 사용해 세부 필드를 검증할 수 있습니다.
- POJO로 응답을 매핑해 직접 검증하는 방법도 있습니다 (`ObjectMapper` 사용).

---

Q6: 테스트 실행 시 서버를 실제로 띄워야 하나요?
A6:
- `MockMvc`는 서버를 띄우지 않아도 컨트롤러를 단위 테스트하고 요청을 시뮬레이션합니다.
- `TestRestTemplate`이나 `RestAssured`는 실제 서버를 띄워 통합 테스트용으로 주로 사용합니다 (`@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`).

---

Q7: JUnit 5 환경에서 MockMvc 사용법은 어떻게 되나요?
A7: 기존 JUnit 4와 비슷하지만, 테스트 메서드에 `@Test`를 적용하고 `@ExtendWith(SpringExtension.class)`를 명시적으로 붙입니다. 보통 `@SpringBootTest`와 `@AutoConfigureMockMvc`만 붙여도 됩니다.

---

Q8: JSON 요청 바디를 포함한 POST 요청을 테스트하려면?
A8:
`MockMvc` 예시:
```java
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"John\"}"))
.andExpect(status().isCreated());
```

`RestAssured` 예시:
```java
given().
contentType(ContentType.JSON).
body("{\"name\":\"John\"}").
when().
post("/users").
then().
statusCode(201);
```

---

Q9: 인증이 필요한 API를 JUnit에서 테스트하려면?
A9:
- `MockMvc`에서는 `with(user("username").password("pwd").roles("USER"))` 식으로 보안 컨텍스트를 설정할 수 있습니다.
- 토큰 기반 인증이면 헤더에 `Authorization` 값을 수동으로 추가해서 테스트 가능합니다.
- RestAssured에서도 헤더 설정이 가능합니다.

---

Q10: 비동기 API 테스트 시 주의할 점은?
A10:
비동기 테스트는 `MockMvc`의 `asyncDispatch()`를 활용하거나, `WebTestClient` 같은 비동기 지원 클라이언트를 사용해야 정확한 응답 검증이 가능합니다.

---

이와 같이 JUnit과 다양한 보조 도구를 결합하면 REST API 테스트를 효과적이고 체계적으로 수행할 수 있습니다.
JUnit에서 REST API를 테스트하는 방법은 여러 가지 접근법이 있으며, 주로 다음과 같은 단계와 도구들을 활용합니다.

JUnit 자체는 테스트 프레임워크로, REST API를 호출하고 응답을 검증하는 기능은 제공하지 않지만, 이를 보완하기 위해 여러 라이브러리 및 방법론이 쓰입니다.

1. 단위 테스트 vs 통합 테스트 구분하기 - *단위 테스트(Unit Test)*: 컨트롤러나 서비스 레이어 내부 로직만 테스트하고 외부 REST 호출은 모킹(Mock) 처리 - *통합 테스트(Integration Test)*: 실제 REST API를 호출하여 시스템 전체 작동 여부를 확인

2. MockMvc (스프링 프레임워크 환경에서) 스프링을 사용하고 있다면 `MockMvc` 클래스를 이용해 웹 애플리케이션 컨텍스트 없이도 컨트롤러 계층에 대해 REST API 호출을 시뮬레이션할 수 있다.

주요 특징: - 서버를 띄우지 않고도 REST 엔드포인트를 호출 가능 - HTTP 메서드(GET, POST 등) 호출, 요청 바디(json 등) 전달, 응답 상태 및 내용 검증 지원 - 예시 코드: ```java @Autowired private MockMvc mockMvc; @Test public void testGetUser() throws Exception { mockMvc.perform(get("/api/users/1")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.username").value("testuser")); } ``` 이는 내장된 Mock 환경에서 REST 호출을 흉내 내는 것이므로 빠르고 효율적이다.



3. RestTemplate 또는 WebTestClient (실제 서버 대상 테스트) - `RestTemplate` (스프링 5 이전)이나 `WebTestClient` (Spring WebFlux에서 도입) 등을 사용해 실제로 서버가 띄워져 있는 상태를 대상으로 REST API를 호출한다.

- 보통 `@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`와 함께 사용해 실제 웹 서버 환경에서 통합 테스트를 수행한다.

- 예시: ```java @LocalServerPort private int port; private String baseUrl; @BeforeEach void setUp() { baseUrl = "http://localhost:" + port; } @Autowired private TestRestTemplate restTemplate; @Test public void testCreateUser() { User user = new User("testuser", "[email protected]"); ResponseEntity response = restTemplate.postForEntity(baseUrl + "/api/users", user, User.class); assertEquals(HttpStatus.CREATED, response.getStatusCode()); assertEquals("testuser", response.getBody().getUsername()); } ``` - 이 방식은 실제 네트워크 요청을 발생시키므로, 테스트가 느릴 수 있지만 실제 환경과 유사한 테스트가 가능하다.

4. 외부 라이브러리 활용 (RestAssured 등) - `RestAssured`는 간결한 문법으로 REST API 테스트를 작성할 수 있도록 도와준다. - JUnit 테스트 내에서 실제 HTTP 요청을 보내고 응답 상태, 내용 등을 쉽게 검증할 수 있다.

- 예시: ```java import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; @Test public void testGetUsers() { given() .baseUri("http://localhost") .port(port) .when() .get("/api/users") .then() .statusCode(200) .body("size()", greaterThan(0)); } ```

5. 테스트 데이터 준비 및 청소 - API 테스트 시 일관된 결과를 위해 테스트 실행 전후에 DB 초기화 혹은 Mock 데이터 등록이 중요하다. - JUnit의 `@BeforeEach`, `@AfterEach` 또는 `@BeforeAll`, `@AfterAll`을 적절히 사용하여 데이터 세트를 관리한다.



6. 검증 요소 - HTTP 상태 코드 (200 OK, 404 Not Found 등) - 응답 헤더 (Content-Type 등) - 응답 바디 내용 (JSON 필드 값, 배열 크기 등) - 예외 발생 여부 및 메시지

7. 실행 자동화 및 지속적 통합 연계 - Maven, Gradle 등의 빌드 도구에서 JUnit 테스트가 실행되도록 설정한다.

- Jenkins, GitHub Actions 등 CI/CD 파이프라인에 통합하여 코드 변경 시마다 API 테스트가 수행되도록 한다.

--- 요약 - 스프링 환경에서는 `MockMvc`를 이용한 컨트롤러 계층 테스트가 효율적이며 빠름 - 실제 서버를 띄워 통합 테스트를 하려면 `@SpringBootTest`와 `TestRestTemplate` 혹은 `WebTestClient` 활용 - 더 다양한 REST API 테스트 기능을 원하면 RestAssured 같은 외부 라이브러리 사용 가능 - 테스트 환경 구축 시 데이터 상태 초기화와 응답 검증을 철저히 하여 신뢰성 확보 이와 같은 방법으로 JUnit을 기반으로 REST API에 대한 다양한 층위의 테스트를 설계하고 수행할 수 있습니다.

작성자: 정지윤 [비회원] | 작성일자: 1년 전 2025-05-26 02:51:21
조회수: 169 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.