[java] PowerMock에서의 현재 시간 모킹

Java에서 단위 테스트를 작성할 때, 시간과 날짜에 의존하는 메소드를 테스트하기 어렵습니다. 다행히도 PowerMock라는 도구를 사용하면 시간에 대한 의존성을 제거하여 테스트를 보다 쉽게 작성할 수 있습니다.

PowerMock란?

PowerMock은 Java의 단위 테스트 도구인 Mockito와 EasyMock을 확장한 도구입니다. PowerMock을 사용하면 정적 메소드, new 연산자로 생성된 객체, final 클래스 및 메소드 등을 모두 모킹할 수 있습니다.

현재 시간 모킹하기

PowerMock를 사용하여 현재 시간을 모킹하는 방법을 알아보겠습니다.

1. PowerMock과 Mockito 의존성 추가

먼저 Maven이나 Gradle을 사용하여 프로젝트에 PowerMock과 Mockito를 추가해야 합니다. Maven의 경우 pom.xml 파일에 다음과 같이 의존성을 추가합니다.

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>

2. @RunWith와 @PrepareForTest 어노테이션 사용

테스트 클래스에 @RunWith(PowerMockRunner.class) 어노테이션을 추가하고, 현재 시간을 사용하는 클래스를 @PrepareForTest 어노테이션의 인자로 전달해야 합니다.

@RunWith(PowerMockRunner.class)
@PrepareForTest({AppUtils.class}) // 현재 시간을 사용하는 클래스 이름 전달
public class SomeTestClass {
    // 테스트 메소드들...
}

3. 현재 시간 모킹하기

// 현재 시간을 반환하는 메소드를 모킹
PowerMockito.mockStatic(AppUtils.class);
Mockito.when(AppUtils.getCurrentTime()).thenReturn(new Date(0));

// 테스트 코드 작성
// AppUtils.getCurrentTime() 메소드를 호출하는 코드 테스트

위의 예시에서는 AppUtils.getCurrentTime() 메소드를 모킹하여 항상 ‘1970-01-01’을 반환하도록 설정했습니다.

결론

PowerMock를 사용하면 현재 시간과 같은 시간에 의존하는 메소드를 테스트하는 것이 더욱 쉬워집니다. 시간에 의존하는 코드를 테스트할 때는 PowerMock를 적절히 활용하여 더 견고하고 신뢰할 수 있는 테스트를 작성할 수 있습니다.