1-4-2 JUnit5로 테스트 케이스 만들기

코딩강사·2022년 11월 6일

1-4-2 JUnit5로 테스트 케이스 만들기

프로젝트뷰에서 build.gradle파일을 열어보면, 이미 JUnit5 라이브러리가 spring-boot-starter-test라는 이름으로 기본으로 들어가 있으므로 그냥 사용하면 됩니다.

testImplementation 'org.springframework.boot:spring-boot-starter-test'

그 밑에 있는 mockito-core:4.8.0은 MockMvc클래스를 사용하기 위해 추가된 내용입니다. MockMvc 클래스는 웹 API 테스트에서 HTTP GET,POST요청을 가상으로 요청할 수 있도록 해주기 위해서 사용합니다.
아래 코드는 직접 코드를 입력해야 합니다. 대소문자와 단따옴표, 콜론 등의 문구가 틀리지 않도록 주의해서 입력해주세요.
혹시 오탈자가 생길 것 같으면 필자의 깃허브 주소를 참조하면 됩니다. 예제 URL : https://bit.ly/3yEk3va

testImplementation 'org.mockito:mockito-core:4.8.0'

입력후에는 저장 후, 오른쪽 상단의 코끼리 아이콘(그레이들의 심볼이다)를 클릭해서 그레이들을 새로고침합니다. 그러면 자동으로 해당 라이브러리를 다운로드해서 사용할 준비가 됩니다.

MainController.java의 main 함수를 테스트 해보겠습니다.
main()위에 커서를 놓고 우클릭하면 생성 메뉴를 클릭하고, 생성뷰에서 다시 테스트...을 클릭합니다.

기본으로 JUnit5가 선택되어 있고, 새로 생성될 클래스이름은 MainControllerTest입니다. 아랫쪽에 테스트한 테스트 메서드 생성란에 main()함수 왼쪽을 체크합니다. 확인을 누르면 테스트 클래스와 메서드가 함께 생성됩니다. 생성된 위치는 scr>test>java>com.study.springboot입니다.

package com.study.springboot;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class MainControllerTest {

    @Test
    void main() {
    }
}

@Test는 테스트 케이스 메서드 마다 들어가는 어너테이션입니다. 테스트 케이스 메서드는 main()함수를 통해서가 아닌 단독적으로 실행 가능합니다.

아래 코드를 추가해 보겠습니다. 예제 URL : https://bit.ly/3fAn0qm

package com.study.springboot;

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;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = MainController.class)
class MainControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void main() throws Exception{
        String hello = "Hello Springboot!!";

        mockMvc.perform(get("/"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
}

윗쪽의 import 구문들은 ALT+ENTER로 자동입력이 가능합니다. 하지만 import할때 참조하는 클래스의 이름이 동일한 것들이 있어, 어떤 클래스가 import될지 몰라 잘못 코드가 추가될 수 있습니다. 예를 들어 content() 메서드의 경우 MockMvcResultMachers클래스의 content() 메서드를 선택해야 됩니다.

따라서 import 코드를 보고 잘 입력되도록 해주세요.

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

타이핑이 어렵다면 소스 URL을 참조해주세요. 예제 URL : https://bit.ly/3T2Hear

@ExtendWith(SpringExtension.class) : JUnit4는 @RunWith 어노테이션을 사용했다면 JUnit5는 @ExtendWith을 사용합니다. @ExtendWith은 기능확장을 위해 사용하는데, 크게 2가지가 쓰입니다. @ExtendWith (SpringExtension.class)와 @ExtendWith (MockitoExtension.class)입니다. SpringExtension클래스는 Spring TestContext Framework와 Junit5을 통합하여 기능을 확장하고, MockitoExtension은 Mokito와 관련된 MockContext기반에서 조금은 가볍게 테스트 진행이 가능합니다.
SpringExtension에서 구현된 인터페이스 목록은 BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback, ParameterResolver이고, MockitoExtension에서 구현된 인터페이스 목록은 BeforeEachCallback, AfterEachCallback, ParameterResolver입니다.

@WebMvcTest(controllers = MainController.class) : @SpringBootTest는 전체 앱에 대한 테스트 지시어라면, @WebMvcTest는 웹 영역만을 테스트 하기 위한 지시어입니다. 옆에 컨트롤러 클래스를 지정하여 의존관계를 체크합니다.
@Autowired : MockMvc클래스의 객체를 mockMvc로 주입(객체생성)받습니다. 뒤에 설명하겠지만, 스프링에서 객체를 주입받는 방법은 3가지 생성자, 필드, 수정자주입 인데, 이중 필드 주입 방식입니다.
@Test : 테스트 케이스 메서드를 지정합니다.
throws Exception : perform() 메서드는 RuntimeException이 발생할 수 있는 코드입니다. 따라서 try catch구문에 넣든지, 자신을 호출한 메서드에 Exception을 넘기는 throws Exception 구문을 넣어주든지 해야 합니다.
perform(get("/")) : HTTP GET방식으로 루트 경로(/)를 호출합니다.
andExpect(status().isOk()) : 점(.)으로 메서드 연결(method chaining)하여 부가적으로 메서드 호출이 가능합니다. isOk()는 HTTP 응답이 200으로 성공적인 응답인지를 확인합니다.
andExpect(content().string(hello)); 메서드 연결으로 응답의 내용이 문자열 hello와 같은지를 확인합니다.

profile
강의하는 개발자

0개의 댓글