## `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)