평소에 서비스 계층과 비즈니스 로직이 담겨있는 코드들만 테스트를 했었다. 하지만 결국 우리는 api를 만들어야 한다. 그렇기에 api에도 테스트 코드가 필요하다.
"api는 포스트맨 같은 툴로 테스트하면 되는 것 아닌가" 라고 생각할 수 있다.
하지만 api를 개발할 때 마다 서버를 재시동 해줘야 하고, 서버가 시동될 때 까지 최소한 몇 초가 걸린다.
api를 테스트할 때마다 서버를 재시동하는 것은 상당히 짜증난다.
따라서 서버를 재시동하지 않아도 api를 검증할 수 있는 웹 계층의 api를 테스트 할 수 있는 테스트 코드를 작성해보자.
먼저 간단한 api를 먼저 만들어보자.
@RestController
public class HomeController {
@GetMapping("/")
public String hello(){
return "hello";
}
}
root 경로로 접속시 화면에 hello 텍스트가 출력된다. 너무 간단해서 api라고 할 것도 없다.
이 코드가 정상적으로 동작하는지 확인하려면 매번 서버를 켜야한다. 위에서 말했듯이 더 효율적으로 검증할 수 있도록 테스트 코드를 작성해보자.
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 라이브러리를 추가했다면 주석처리 해주자.