[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를 적절히 활용하여 더 견고하고 신뢰할 수 있는 테스트를 작성할 수 있습니다.