본문 바로가기
dev/java

Mockito - 메서드 체이닝 테스트 코드 작성하기

by igooo 2025. 8. 25.
728x90

개요

mockito를 사용하여 테스트 코드를 작성하다 보면 Spring WebClient처럼 메서드 체이닝을 사용하여 작성된 코드에 테스트 코드를 작성해야 하는 경우가 있다. 일반적인 mock 처리 방법을 사용하여 테스트 코드를 작성하면 메서드 체이닝에 포함된 모든 메서드에 대하여 mock 처리 코드를 추가해야 하지만, Mockito의 RETURNS_DEEP_STUBS를 사용하면 테스트 코드를 더 간결하게 작성할 수 있으니 알아보도록 하자.

 

As-is

Mockito를 사용하여 기존처럼 테스트 코드를 작성하면 webClient에 메서드 체이이닝에 대하여 모든 메서드를 given으로 mock 처리를 해야 해서 테스트할 코드보다 테스트 코드가 길어지는 상황이 발생하게 된다.

class WebClientServiceImpl {
	private final WebClient webClient;

	......
    
	public void post() {
		var body = new HashMap<String, Object>();
		body.put("title", "igooo");
		body.put("content", "test contests");

		// API 요청
		var response = webClient.post().url("/api/post")
        		.bodyValue(body)
                .retrieve()
                .bodyToMap(Map.class)
                .block();
		.....
    }
}

class WebClientServiceImplTests {
	@Mock
	private WebClient webClient;
    
	......

	@Test
	void post() {
		var requestBodyUriSpec = mock(WebClient.RequestBodyUriSpec.class);
		given(webClient.post()).willReturn(requestBodyUriSpec);
		given(requestBodyUriSpec.url("/api/post")).willReturn(requestBodyUriSpec);
		given(requestBodyUriSpec.bodyValue(any())).willReturn(requestBodyUriSpec);
		......
	}
}

 

To-be

RETURNS_DEEP_STUBS를 사용하면 메서드 체이닝에 대한 코드를 간결하게 작성할 수 있다.

사용 방법은 @Mock 어노테이션에 answer 값을 RETURNS_DEEP_STUBS을 지정하면 된다.

(참고 mock(Answers.RETURNS_DEEP_STUBS, WebClient.class)

class WebClientServiceImplTests {
	@Mock(answer = Answers.RETURNS_DEEP_STUBS)
	private WebClient webClient;

	......
    
	@Test
	void test(){
		......
		given(webClient.post().url("/api/post")
				.bodyValue(body)
				.retrieve()
				.bodyToMap(Map.class)
				.block()).willReturn(Map.of("id", 1L, "title", "igooo");
		......
    }

}

 

참고

RETURNS_DEEP_STUBS을 사용하면 아래와 같은 장점이 있다.

  • 코드를 간결하게 작성할 수 있다.
  • 메서드 체이닝을 자연스럽게 표현할 수 있다.
  • 테스트 코드가 간결해지면서 테스트 의도를 명확히 드러나게 작성할 수 있다.

다만 RETURNS_DEEP_STUBS를 과도하게 사용하게 되면 테스트가 구현 코드에 너무 강하게 결합될 수 있으므로, WebClient 처럼 체이닝이 많은 코드에 대해서만 제한적으로 사용하는 것을 추천한다.

 

728x90

'dev > java' 카테고리의 다른 글

JDK 24 새로운 기능  (0) 2025.03.30
Using JSpecify Annotations  (0) 2025.02.25
JSpecify Nullness User Guide  (0) 2025.02.19
Win10 SDKMAN으로 JAVA 설치하기  (0) 2025.01.14
Building a SpringBoot Monorepo with Gradle  (2) 2024.11.06