[Test] Mock

Oksun Noh·2025년 2월 28일
0

Spring & Spring Boot

목록 보기
6/6

작성 목적

  1. Mock 과 Mockito의 차이 이해
  2. MockBean의 사용 이유

Mock 이란?

  1. 진짜처럼 행동하는 가짜 객체: 쉽게 생각하면 '목업'을 생각하면 됨.
  2. 테스트를 간편하게 만들기 위해서 주로 사용함
  3. 특히나 복잡한 시스템을 테스트 할 떄 부담이 좀 적어짐

Mockito ?

  1. Mock을 쉽게 만들어주는 도구(라이브러리)임

    • 쉽게 생각하면 리모콘이라고 생각하면 됨
  2. 코드예시

@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));
	}
profile
저는 만두를 좋아합니다

0개의 댓글