테스트 코드를 작성하고 싶은 클래스 위에 마우스 커서를 올려 놓고 Alt + Enter를 눌러 [createTest]를 누르면 해당 클래스의 테스트 파일이 자동으로 test/java/ 패키지 아래에 생성된다.
테스트 클래스 로직 작성 전 다음과 같이 테스트 코드의 틀을 먼저 작성한다.
//TestControllerTest.java
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성
class TestControllerTest {
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private MemberRepository memberRepository;
@BeforeEach // 테스트 실행 전 실행하는 메소드
public void mockMvcSetUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.build();
}
@AfterEach // 테스트 실행 후 실행하는 메소드
public void cleanUp() {
memberRepository.deleteAll();
}
/*
테스트 클래스 로직 작성
*/
}
@SpringBootTest
메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpringBootApplication이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트라는 것을 만든다. 이를 통해 테스트할 때 실제 애플리케이션과 유사한 빈들을 포함하는 컨텍스트를 사용할 수 있게 된다
@AutoConfigureMockMvc
MockMvc를 생성하고 자동으로 구성하는 애너테이션이다.
MockMvc는 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스이다. 즉, 컨트롤러를 테스트할 때 사용되는 클래스이다.
@Autowired
: 의존성 주입을 할 때 사용하는 Annotation으로 의존 객체의 타입에 해당하는 bean을 찾아 주입하는 역할을 한다. 생성자, setter, 필드에 사용될 수 있다.
@BeforeEach
테스트를 실행하기 전에 실행하는 메소드에 적용하는 애너테이션이다.
위 코드에서는 MockMvcSetUp()메소드를 실행해 MockMvc를 설정해준다.
@AfterEach
테스트를 실행한 이후에 실행하는 메소드에 적용하는 애너테이션이다.
위 코드에서는 cleanUp()메소드를 실행해 member 테이블에 있는 데이터들을 모두 삭제한다.
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성
class TestControllerTest {
/*
생략
*/
// Given-When-Then 패턴 적용
@DisplayName("getAllMembers: 아티클 조회에 성공한다.") //테스트 이름을 명시
@Test // 테스트를 수행하는 메소드임을 명시
public void getAllMembers() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
// when
final ResultActions result = mockMvc.perform(get(url)
.accept(MediaType.APPLICATION_JSON));
// then
result
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
}
- Given : 멤버 저장
- When : 멤버 리스트를 조회하는 API 호출
- Then 응답 코드가 200 Ok이고, 반환받은 값 중에 0번째 요소의 id와 name이 저장된 값이 같은지 확인한다.
ResultActions 클래스
: Spring MVC의 테스트 프레임워크에서 제공되며, HTTP 요청에 대한 응답을 테스트하기 위한 메서드를 제공한다. 이 클래스는 주로 MockMvc.perform() 메서드로부터 반환되고, 다양한 검증에 관한 메서드를 제공한다.
- andExpect()
: 응답의 상태 코드, 내용, 헤더 등을 검증하는 데 사용된다.
- andDo()
: 테스트 실행 중에 추가 작업을 수행하는 데 사용된다. 예를 들어, 로그를 출력하거나 디버깅에 도움이 되는 정보를 수집하는 등의 작업을 수행할 수 있다.
- andReturn()
: 컨트롤러 메서드가 반환한 객체나 데이터를 가져오는데 사용된다. 이를 통해 컨트롤러에서 반환한 객체를 테스트에서 활용할 수 있다.
- andDo(print())
: 요청 및 응답의 내용을 콘솔에 출력하는 데 사용된다. 주로 디버깅 시 사용된다 .
perform()
: MockMvc에서 제공되는 메서드로, 실제 HTTP 요청을 수행하는 역할을 한다.
perform() 메서드의 인자에는 MockHttpServletRequestBuilder 객체가 들어가고, 이 객체는 MockMvc를 사용하여 수행할 HTTP 요청(post, get, put, delete, ...)을 나타낸다.
- MockHttpServletRequestBuilder 제공 메서드
- get(String url, ...)
- post(String url, ...)
- put(String url, ...)
- delete(String url, ...)
- 각 메서드별로 URL, URL 매개변수, Query 매개변수 등을 인자로 줄 수 있다.
accept()
: 요청을 보낼 때 무슨 타입으로 응답을 받을지 결정하는 메소드. JSON, XML 등 다양한 타입의 응답을 받을 수 있다.
andExpect()
: ResultActions 객체가 제공하는, HTTP 응답을 검증하는 메소드이다. 예를 들어, 상태 코드, 헤더, JSON 응답의 특정 필드 등을 확인할 수 있다.
jsonPath("{필드명}).value(x)
: JSON 응답값의 값을 가져오는 메소드이다. n번째 배열에 들어있는 객체의 필드 값을 가져오고, 저장된 값과 x값이 같은 지 확인한다.
cf. 주요 HTTP 응답 확인 메소드
- isOk()
: HTTP 응답 코드가 200 OK인지 확인.
- isCreated()
: HTTP 응답 코드가 201 Created인지 확인.
- isBadRequest()
: HTTP 응답 코드가 400 Bad Request인지 확인.
- isForbidden()
: HTTP 응답 코드가 403 Forbidden인지 확인.
- isNotFound()
: HTTP 응답 코드가 404 Not Found인지 확인.
- is4xxClientError()
: HTTP 응답 코드가 400번대인지 확인.
- isInternalServerError()
: HTTP 응답 코드가 500 Internal Server Error인지 확인.
- is5xxServerError()
: HTTP 응답 코드가 500번대인지 확인.
해당 테스트 파일에 오른쪽 마우스를 클릭하고 [Run '클래스 이름']를 선택하여 테스트 코드를 실행한다.
cf. 만약 테스트 실행 버튼이 없다면 @Test 관련 import문을 잘 작성했는지 확인한다.