PHpullh

JAVA · 테스트

ArgumentCaptor

ArgumentCaptor로 메서드에 전달된 인자를 캡처하여 상세 검증합니다.

테스트고급ArgumentCaptorMockito인자캡처검증

핵심 설명

ArgumentCaptor로 메서드에 전달된 인자를 캡처하여 상세 검증합니다.

Java code

// import org.mockito.*;
// import static org.mockito.Mockito.*;

// ArgumentCaptor 패턴 (의사코드)
// class NotificationServiceTest {
//     EmailSender sender = mock(EmailSender.class);
//     NotificationService service = new NotificationService(sender);
//
//     @Test
//     void sendOrderConfirmation() {
//         // When
//         service.confirmOrder("ORD-123", "hong@test.com");
//
//         // Then: 인자 캡처
//         ArgumentCaptor<Email> captor = ArgumentCaptor.forClass(Email.class);
//         verify(sender).send(captor.capture());
//
//         Email captured = captor.getValue();
//         assertEquals("hong@test.com", captured.getTo());
//         assertTrue(captured.getSubject().contains("ORD-123"));
//         assertTrue(captured.getBody().contains("주문 확인"));
//     }
//
//     @Test
//     void sendMultipleEmails() {
//         service.notifyAll(List.of("a@test.com", "b@test.com"));
//
//         ArgumentCaptor<Email> captor = ArgumentCaptor.forClass(Email.class);
//         verify(sender, times(2)).send(captor.capture());
//
//         List<Email> allEmails = captor.getAllValues();
//         assertEquals(2, allEmails.size());
//         assertEquals("a@test.com", allEmails.get(0).getTo());
//     }
// }

class Main {
    public static void main(String[] args) {
        System.out.println("ArgumentCaptor: 복잡한 객체 인자의 내부 상태를 검증합니다.");
        System.out.println("getValue()=마지막 캡처, getAllValues()=모든 캡처");
    }
}

학습 팁

ArgumentCaptor는 복잡한 객체가 올바르게 구성되었는지 검증할 때 유용합니다. DTO나 이벤트 객체 검증에 자주 쓰입니다.

주의할 점

capture()when() 스텁에서 사용하면 예상치 못한 동작이 발생합니다. verify()에서만 사용하세요.

자주 묻는 질문

ArgumentCaptor란 무엇인가요?

ArgumentCaptor 로 메서드에 전달된 인자를 캡처하여 상세 검증합니다.

ArgumentCaptor 학습 시 주의할 점은 무엇인가요?

capture() 를 when() 스텁에서 사용하면 예상치 못한 동작이 발생합니다. verify() 에서만 사용하세요.