본문 바로가기
관리자

Programming-[Backend]/Java

[TIL] mockStatic

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
반응형