【JUnit】【Mock】 PowerMock ~ 入門編 ~


■ 設定

 * Gradleを使う

build.gradle

dependencies {
    // PowerMock
    testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.3'
    testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.3'
}

■ サンプル1:Calendar.getInstance()のモック化

 * Calendar.getInstance()をモック化する

DateUtil.java

テスト対象
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
  public static Date getCurrentDate() {
    // 内部で、Calendar.getInstance()を呼んでいる
    Calendar calendar = Calendar.getInstance();
    return calendar.getTime();
  }
}

DateUtilTest.java

テストコード
import static org.junit.Assert.*;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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

@RunWith(PowerMockRunner.class) // ★重要★
@PrepareForTest({Calendar.class, DateUtil.class}) // ★重要★
public class DateUtilTest {

  @Test
  public void getCurrentDateTest() {
    Calendar mockCalendar = Calendar.getInstance();
    mockCalendar.set(2018, 1, 9, 22, 20, 9);
    mockCalendar.set(Calendar.MILLISECOND, 0);
    PowerMockito.mockStatic(Calendar.class);
    PowerMockito.when(Calendar.getInstance()).thenReturn(mockCalendar);

    Date result = DateUtil.getCurrentDate();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    System.out.println("Date : " + simpleDateFormat.format(result));
    assertEquals("2018/02/09 22:20:09", simpleDateFormat.format(result));
  }
}

■ サンプル2:System.getenv()のモック化

 * 環境変数の取得 System.getenv()をモック化する
 * 以下の関連記事「JUnit環境変数を変更するテストを行うには...」で行ったことを
   PowerMock を使って行う
https://blogs.yahoo.co.jp/dk521123/37474828.html

SampleTest.java

テストコード
import static org.junit.Assert.*;

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

@RunWith(PowerMockRunner.class) // ★重要★
@PrepareForTest({System.class}) // ★重要★
public class SampleTest {

  @Test
  public void test() {
    PowerMockito.mockStatic(System.class);
    PowerMockito.when(System.getenv("ENV_KEY")).thenReturn("dummy01");

    assertEquals("dummy01", System.getenv("ENV_KEY"));
  }
}

■ トラブル

 * 以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37484598.html