진짜처럼 행동하는 가짜 객체
: 쉽게 생각하면 '목업'을 생각하면 됨.Mock을 쉽게 만들어주는 도구(라이브러리)임
코드예시
@ExtendWith({SpringExtension.class, MockitoExtension.class})
@WebMvcTest(AuthController.class)
public class AuthControllerTest {
// 스프링이 제공하는 도구이기 때문에, 실제 객체를 사용해야함
@Autowired
private MockMvc mockMvc;
// 실제 데이터베이스를 사용하지 않고 테스트하기 위함
@MockBean // Mock으로 처리
private AuthService authService;
@MockBean // Mock으로 처리
private CookieUtil cookieUtil;
@Autowired
private ObjectMapper objectMapper;
@Test
@DisplayName("회원가입 성공")
void signUpTest1() throws Exception {
// given - 테스트를 위한 입력 값
SignUpRequestDTO req = new SignUpRequestDTO(
"test123@test.com",
"Okman",
"1q2w3e4r!!",
"profile.png",
false
);
// authService.signUp()이 실행될 때 실제 동작하지 않고, 아무일도 하지 않도록 설정 (Mock 처리)
doNothing().when(authService).signUp(any(SignUpRequestDTO.class));
// When & Then
mockMvc.perform(post("/auth/signup")
// 요청의 Content-Type을 JSON으로 설정
.contentType(MediaType.APPLICATION_JSON)
// req 객체를 JSON 문자열로 변환해서 요청 본문에 전달
.content(objectMapper.writeValueAsString(req)))
.andExpect(status().isCreated())
.andExpect(content().string("회원가입이 완료되었습니다."))
.andDo(print());
// authService.signUp()이 한 번 호출되었는지 검증
verify(authService, times(1)).signUp(any(SignUpRequestDTO.class));
}