미니 프로젝트 - 테스트 코드 ArgumentCaptor 사용법

Zyoon·2025년 7월 1일

미니프로젝트

목록 보기
21/36
post-thumbnail

❗void 메서드 테스트에서 ArgumentCaptor로 값 검증하기


📍ArgumentCaptor

  • 테스트 코드 작성 시 리턴 값도 없고, 외부로 노출되지도 않는 메서드의 확인이 필요할 때가 있다.
  • ArgumentCaptor 는 메서드가 실제로 호출될 때 전달된 인자(argument)를 캡처한다.
  • 그래서 그 값이 맞는지 검증할 수 있게 해주는 기능을 가지고 있다.

📍예시 상황

public class MessageService {
    public void send(String to, String content) {
        //문자 보내는 기능
    }
}
  • send() 메서드가 잘 작동하는지 테스트가 하고 싶다.
  • 하지만 메서드가 호출됐는지만 확인할 수 있고,전달된 객체 안에 어떤 값이 들어있는지는 확인 불가능

📍일반 테스트 코드 (verify만 사용)

MessageService service = mock(MessageService.class);

// 테스트 대상 실행
service.send("010-1234-5678", "hello");

// 호출 여부만 검증
verify(service).send(anyString(), anyString()); // → 호출은 됐는지 확인 OK
  • 이 방법으로는 어떤 번호에 어떤 내용이 갔는지 알 수 없다.

📍ArgumentCaptor 사용

MessageService service = mock(MessageService.class);

// 1. 테스트 실행
service.send("010-1234-5678", "hello");

// 2. captor 생성
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);

// 3. 두 개의 인자를 각각 캡처
verify(service).send(captor .capture(), captor .capture());

// 4. 꺼내서 검증
List<String> args = captor .getAllValues();
String to = args.get(0);
String content = args.get(1);

// to → 010-1234-5678
// content → hello
  1. 테스트 실행
  2. captor 생성 → 해당 인자의 타입으로 생성(여기서는 String)
  3. ArgumentCaptor가 이 두 값을 캡쳐
  4. getValue() 또는 getAllValues()로 꺼내서 확인

📍ArgumentCaptor가 필요한 경우

  • void 메서드인데 전달된 인자값을 확인하고 싶을 때
  • mock이 호출됐을 때, 내부에 전달된 객체의 내용까지 검증해야 할 때
  • 대표적인 예 : 이벤트 발행(publishEvent), 알림 전송, 로그 저장
profile
기어 올라가는 백엔드 개발

0개의 댓글