본문 바로가기
Spring

[Spring] 스프링 부트 3.4 테스트 관련 신규 사항 (feat. MockMvcTester)

by Nhahan 2025. 2. 21.

1. @MockitoBean

기존에는 @MockBean을 사용해 컨텍스트 내의 빈을 모킹했지만, 스프링 부트 3.4부터는 @MockitoBean을 사용한다.
@MockitoBean은 테스트 컨텍스트에서 Mockito를 직접 활용해 모킹된 객체를 빈으로 등록하는 데 특화되어 있다.
'org. springframework. boot. test. mock. mockito. MockBean' is deprecated since version 3.4.0 and marked for removal

 

어차피 3.4부터는 더 이상 @MockBean을 쓰지 못하게 되었으므로, 강제로 @MockitoBean을 쓸 수 밖에 없다.

 

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoBean
	CustomService customService;

	// tests...
}

(공식 문서 Java 예시)

 

 

2. MockMvcTester

MockMvcTester 내부 구현을 보면 알겠지만, MockMvcTester도 내부적으론 MockMvc를 사용하고 있다.

스프링 공식 문서에서는 AssertJ와 더 잘 통합되어 메서드 체이닝을 통해 fluent하다라고 서술하고 있다.

 

@Test
fun `로그인 API - 올바른 자격 증명 시 JWT 토큰 반환`() {
    val signinRequest = SigninRequest(
        email = "user@example.com",
        password = "password"
    )
    val dummyToken = "tokenValue"
    whenever(authService.signin(any())).thenReturn(AuthResponse(dummyToken))

    val mvcResult = mockMvcTester.post().uri("/auth/signin")
        .contentType(MediaType.APPLICATION_JSON)
        .content(objectMapper.writeValueAsString(signinRequest))
        .exchange()

    assertThat(mvcResult)
        .hasStatusOk()
        .hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON)
        .bodyJson()
        .extractingPath("$.token")
        .isEqualTo(dummyToken)
}

 

 

  MockMvc MockMvcTester
Assertion 라이브러리 Hamcrest AssertJ
결과 처리 andReturn() exchange()
가독성 Hamcrest로 상대적으로 복잡 AssertJ로 익숙하고 쉬움

 

Spring Boot 3.4.x을 사용 중이라면, 솔직히 MockMvcTester를 쓰지 않을 이유가 전혀 없어보인다.

 

 


 

(MockMvcTester 비동기 테스트 코드 예시)

더보기
@RestController
public class ComputeController {
    @RequestMapping("/compute")
    public Callable<ResponseEntity<String>> compute() {
        return () -> {
            Thread.sleep(100); // 비동기 처리
            return ResponseEntity.ok("computed");
        };
    }
}

@Test
void testAsyncProcessing() {
    MockMvcTester mockMvc = MockMvcTester.of(new ComputeController());

    assertThat(
        mockMvc.get().uri("/compute")
               .exchange(Duration.ofSeconds(5))
    )
    .hasStatusOk()
    .bodyJson()
    .isLenientlyEqualTo("computed");
}
반응형

댓글