728x90
반응형
개요
static 클래스를 테스트해야할 경우가 발생했다. 아래와 같이 Spring의 의존성 없이 Factory 메서드로 DI를 구현할 때, Factory 자체를 mock 처리해야했다.
SmsServiceFactory.get(config.getConfig()).send(normalizeMobileNumber, smsText);
이 때 SmsServiceFactory의 get 메서드 자체를 mock 처리하기 위해서 mockStatic을 사용했다.
기본적으로 Mockito는 인스턴스 메서드(Mock 객체)만 지원하지만, Java의 static 메서드는 인스턴스 없이 호출되므로 기본적인 @Mock이나 when()을 사용할 수 없다. 이를 해결하기 위해 Mockito 3.4+ 버전부터 mockStatic()을 제공하여 static 메서드를 Mocking할 수 있도록 지원한다.
활용
다음과 같이 테스트 코드에서 활용한다. 주의할점은 @BeforeEach를 통해 mockStatic을 정의했다면 @AfterEach에서 mockStatic을 close() 처리해줘야한다. 아니면 다른 @Test 메서드에서 중복으로 호출하여 에러가 난다.
@ExtendWith(MockitoExtension.class)
class messageApiServiceTest {
@Mock private HttpRequestService httpRequestService;
private messageApiService messageApiService;
private MockedStatic<HttpRequestServiceFactory> mockedStatic;
@BeforeEach
void setUp() {
mockedStatic = mockStatic(HttpRequestServiceFactory.class);
mockedStatic.when(HttpRequestServiceFactory::get).thenReturn(httpRequestService);
}
@AfterEach
void tearDown() {
if (mockedStatic != null) mockedStatic.close(); // ✅ 테스트가 끝나면 반드시 MockedStatic을 해제하여 중복 호출 방지
}
@Test
@DisplayName("올바른 객체와 인자들로 send 메서드가 호출됨")
void send_ShouldCallHttpRequestServiceWithCorrectParameters() {
// Given
...중략
doNothing().when(httpRequestService).sendJsonRequest(any(), any(), any(), any()); // ✅ sendJsonRequest()의 기본 동작을 무시하도록 설정
... 이하 생략
}
}
728x90
반응형
'Programming-[Backend] > Java' 카테고리의 다른 글
.jar java SPI 모듈 개발: Factory Pattern(w/o Spring), ServiceLoader, @AutoService (0) | 2025.02.27 |
---|---|
[TIL] JVM HeapSize, HeapDumpPath 설정 (0) | 2025.01.06 |
Virtual Thread 기초 (0) | 2024.12.08 |
비동기 작업: @Async 어노테이션, 스레드 관리 (0) | 2024.11.14 |
[TIL] Docker image JVM Heap 크기 및 옵션 설정, buildpack-gradle bootBuildImage, Packeto buildpack (0) | 2024.07.26 |