웹 계층 테스트 코드 작성하기 - JUnit5

1

Spring

목록 보기
4/12
post-thumbnail

평소에 서비스 계층과 비즈니스 로직이 담겨있는 코드들만 테스트를 했었다. 하지만 결국 우리는 api를 만들어야 한다. 그렇기에 api에도 테스트 코드가 필요하다.

"api는 포스트맨 같은 툴로 테스트하면 되는 것 아닌가" 라고 생각할 수 있다.

하지만 api를 개발할 때 마다 서버를 재시동 해줘야 하고, 서버가 시동될 때 까지 최소한 몇 초가 걸린다.

api를 테스트할 때마다 서버를 재시동하는 것은 상당히 짜증난다.

따라서 서버를 재시동하지 않아도 api를 검증할 수 있는 웹 계층의 api를 테스트 할 수 있는 테스트 코드를 작성해보자.


먼저 간단한 api를 먼저 만들어보자.

@RestController
public class HomeController {
    
    @GetMapping("/")
    public String hello(){
        return "hello";
    }
}

root 경로로 접속시 화면에 hello 텍스트가 출력된다. 너무 간단해서 api라고 할 것도 없다.

  • @RestController : Json을 반환하는 컨트롤러(@Controller + @ResponseBody)

이 코드가 정상적으로 동작하는지 확인하려면 매번 서버를 켜야한다. 위에서 말했듯이 더 효율적으로 검증할 수 있도록 테스트 코드를 작성해보자.

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;

@WebMvcTest(controllers = HomeController.class)
class HomeControllerTest {

    @Autowired
    MockMvc mvc;

    @Test
    public void return_hello() throws Exception{
        // given
        String re = "hello";

        // when, then
        mvc.perform(get("/"))
                .andExpect(content().string(re));
    }
}
  • @WebMvcTest(controllers = HomeController.class) : 선언시 @Controller, @ControllerAdvice 사용 가능

  • MockMvc : 웹 API 테스트 시 사용, http GET, POST .. 요청 테스트 가능

  • .perform(get("/")) : http "/" 경로로 GET 요청

  • .andExpect(content().string(re)) : .perform 결과 검증, 요청한 값과 re(본문)의 값이 같은지 검증

참고로 MockMvc를 주입 받을 때 mvc에 빨간줄이 나올 수 있는데 신경 쓰지 않아도 된다.

만약 시큐리티의 인증과 인가 설정이 안되어있는데 gradle에 Security 또는 Oauth 라이브러리를 추가했다면 주석처리 해주자.

0개의 댓글