## `Spring MockMvc`란? MVC 패턴 기반 서버를 모의(Mock)로 실행하여 테스트하는 클래스. 스프링 테스트 모듈 안에 포함되어 있다. 보통 클라이언트와 서버 사이의 요청-응답 기능이 정상 작동하는지 확인하는 용도로 사용한다. ## `MockMvc`를 통한 요청-응답 테스트 과정 ![[Pasted image 20231214151547.png]] [출처](https://terasolunaorg.github.io/guideline/5.4.1.RELEASE/en/UnitTest/ImplementsOfUnitTest/UsageOfLibraryForTest.html) `MockMvc`를 통한 테스트 작동 과정은 다음과 같다. >0. 개발자가 테스트 케이스에 MockMvc를 이용한 테스트 코드를 작성하고 실행한다. >1. MockMvc 인스턴스가 생성되면서 내부에 `TestDispatcherServlet` 인스턴스가 생성된다. >2. MockMvc 인스턴스는 `MockMvcRequestBuilder`를 통해 모의 요청을 만들어 내부에 있는 `TestDispatcherServlet`에게 전달한다. >3. `TestDispatcherServlet`는 실제 `DispatcherServlet`처럼 요청을 처리할 컨트롤러를 찾아 요청 정보를 전달한다. >4. 요청에 대한 응답은 `ResultActions`의 형태로 오게 되고 `MockMvcResultMatchers`를 통해 응답 메시지를 검증하게 된다. ## 테스트 예시 ![[4-3 컨트롤러 테스트 코드(API)#클래스 생성]] ![[4-3 컨트롤러 테스트 코드(API)#POST 테스트]] 위의 테스트 작동 과정에 맞춰서 예시 코드를 정리해보면 아래와 같다. >1. MockMvc 인스턴스가 생성되면서 내부에 `TestDispatcherServlet` 인스턴스가 생성된다. > 1. `@AutoConfigureMockMvc`을 통해 `MockMvc` 빈이 등록되고 `TestDispatcherServlet` 인스턴스도 생성된다. >2. MockMvc 인스턴스는 `MockMvcRequestBuilder`를 통해 모의 요청을 만들어 내부에 있는 `TestDispatcherServlet`에게 전달한다 > 1. `post("/prompt-template").contentType( [생략] ) .content( [생략] )`이 `MockMvcRequestBuilder`로 `POST` 요청을 모의로 만들고 > 2. `mockMvc.perform()`으로 모의 요청을 테스트 디스패처 서블릿으로 전달한다. >3. 요청에 대한 응답은 `ResultActions`의 형태로 오게 되고 `MockMvcResultMatchers`를 통해 응답 메시지를 검증하게 된다. > 1. `mockMvc.perform()`이 `ResultActions`를 반환하고 `andExpect()` 안에 있는 `status().isCreated()` 같은 메서드들이 `MockMvcResultMatchers`에 해당한다. ## 참고하면 좋은 자료 - [jkijki12 님의 정리 자료](https://velog.io/@jkijki12/Spring-MockMvc)