[java] PowerMock에서의 날짜와 시간 모킹

PowerMock는 자바의 단위 테스트를 위해 사용되는 강력한 도구입니다. 특히 PowerMock은 자바의 시스템 클래스들을 모킹하고 변경할 수 있는 기능을 제공합니다. 이러한 기능을 사용하여 날짜와 시간을 모킹하는 방법에 대해 알아보겠습니다.

1. PowerMock의 의존성 추가

처음으로 PowerMock를 사용하기 위해서는 프로젝트의 의존성 파일에 PowerMock의 관련 라이브러리를 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음 의존성을 추가하세요.

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.7</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.7</version>
    <scope>test</scope>
</dependency>

Gradle을 사용한다면 build.gradle 파일에 다음 의존성을 추가하세요.

testImplementation 'org.powermock:powermock-module-junit4:2.0.7'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.7'

의존성을 추가한 후 프로젝트를 다시 빌드하세요.

2. 날짜와 시간 모킹하기

PowerMock를 사용하여 날짜와 시간을 모킹하는 방법은 크게 두 가지가 있습니다. 첫 번째 방법은 Calendar.getInstance() 메소드를 모킹하는 것이고, 두 번째 방법은 new Date() 생성자를 모킹하는 것입니다.

2.1. Calendar.getInstance() 모킹하기

아래의 예제 코드를 참고하여 Calendar.getInstance() 메소드를 모킹하는 방법을 살펴봅시다.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.Calendar;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Calendar.class})
public class DateMockingTest {

    @Test
    public void testCalendarMocking() throws Exception {
        Calendar mockedCalendar = mockStatic(Calendar.class).getMockInstance();
        
        // 모킹할 시간 설정
        mockedCalendar.set(2022, Calendar.JANUARY, 1);
        
        // 모킹된 시간으로 결과 검증
        Calendar resultCalendar = Calendar.getInstance();
        assertEquals(mockedCalendar.getTimeInMillis(), resultCalendar.getTimeInMillis());
    }
}

위 코드에서 주요한 부분은 다음과 같습니다.

2.2. new Date() 생성자 모킹하기

아래의 예제 코드를 참고하여 new Date() 생성자를 모킹하는 방법을 살펴봅시다.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.Date;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.whenNew;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Date.class})
public class DateMockingTest {

    @Test
    public void testDateMocking() throws Exception {
        Date mockedDate = PowerMockito.mock(Date.class);
        
        // 모킹할 날짜 설정
        Date expectedDate = new Date(1234567890L);
        whenNew(Date.class).withAnyArguments().thenReturn(mockedDate);
        when(mockedDate.getTime()).thenReturn(expectedDate.getTime());
        
        // 모킹된 날짜로 결과 검증
        Date resultDate = new Date();
        assertEquals(expectedDate, resultDate);
    }
}

위 코드에서 주요한 부분은 다음과 같습니다.

결론

PowerMock를 사용하면 자바의 시스템 클래스들인 CalendarDate 클래스를 모킹하여 날짜와 시간을 테스트할 수 있습니다. 이를 통해 단위 테스트의 정확성과 안정성을 높일 수 있습니다. 자세한 내용은 PowerMock의 공식 문서를 참고하시기 바랍니다.

참고 자료