1) 빠른 피드백
2) 자동 검증 가능
3) 개발자가 만든 기능을 안전하게 보호
출처: https://github.com/june0216/efub3-springboot-webservice-study/issues/5
➕ JUnit4 → JUnit5 변경 사항
@RunWith
: 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다. JUnit4에서는 @RunWith(SpringRunner.class)
를 붙여서, 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자(여기선 SpringRunner라는 스프링 실행자)를 실행시켰어야 했다. JUnit5부터는 Extention으로 테스트를 실행하는 방법을 커스텀할 수 있으며, @RunWith(SpringRunner.class)
과 유사하게 @ExtendWith(SpringExtension.class)
로 Extension 구현체를 지정해줄 수 있다.@ExtendWith(SpringExtension.class)
가 이미 매타 애너테이션으로 적용되어 있어서 생략 가능하다. 여기에는 @SpringBootTest
와 @WebMvcTest
가 포함된다.@WebMvcTest
는 여러 스프링 애너테이션 중, Web(Spring MVC)에 집중할 수 있는 애너테이션이다.@SpringBootTest
는 프로젝트의 전체 컨텍스트를 로드하여 모든 빈을 다 가져와 주입하기 때문에 속도가 느리다. 그래서 통합 테스트할 때 주로 사용한다.@WebMvcTest
는 필요한 빈만 가져와서 속도가 빠르다. 보통 컨트롤러 하나를 테스트할 때 주로 사용된다. (SpringBootTest와 동시에 쓰면 에러 발생)@controller
, @ControllerAdvice
등 웹과 관련된 빈만 주입되어 사용할 수 있다.@service
, @component
, @repository
등은 빈을 정의하지 못해 사용할 수 없다.테스트 코드
package com.jinsim.book.springboot.web;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(controllers = HelloController.class)
// Web(Spring MVC)에 집중할 수 있는 애너테이션. 컨트롤러 하나를 테스트할 때 주로 사용됨
// 내부에 @ExtendWith(SpringExtension.class)가 적용되어 있다.
class HelloControllerTest {
// 클래스 및 메서드에 public 생략 가능
@Autowired
// 스프링이 관리하는 빈을 주입 받는다.
private MockMvc mvc;
// 서블릿을 Mocking한 객체로, 웹 API를 테스트할 때 사용한다.
// 이 클래스를 통해 HTTP Get, Post 등에 대한 API 테스트를 할 수 있다.
@Test
// 해당 메서드가 테스트 메서드임을 명시한다.
void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
// MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다.
// 체이닝이 지원되므로 아래로 mvc.perform의 결과에 대한 검증 기능을 이어서 선언할 수 있다.
.andExpect(status().isOk())
// HTTP Header의 Status를 검증한다.(200 404 등 상태 검증, 여기선 200인지 검증)
.andExpect(content().string(hello));
// 응답 본문의 내용을 검증한다. HelloController에서 "hello"를 반환하는지 검증한다.-
}
}
implementation('org.projectlombok:lombok')
작성하고 라이브러리 내려받기HelloResponseDto
코드 작성