PowerMock

mockitで実現できない(しづらい)staticメソッドやprivateメソッドのモック化をする
PowerMockを使ってみる。 今回はひとまずstaticメソッド。

テスト対象クラス

   private StudyUtil() {
        
    }
    
    //本日日付をYYYYMMDDで返却する
    public static String getToday(){
        return LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
    }

テストクラス

    @Test
    //通常のテスト
    public void getTodayTest() {
        assertThat(StudyUtil.getToday(), is("20180131"));
    }
    
    @Test
    //モック化したテスト      
    public void getTodayTest2() {
        //モック化
        PowerMockito.mockStatic(StudyUtil.class);
        //モック化(任意のメソッドの返り値を変更できる)
        PowerMockito.when(StudyUtil.getToday()).thenReturn("19270101");
        assertThat(StudyUtil.getToday(), is("19270101"));
    }

実行すると・・・なんかエラー出た。

org.powermock.api.mockito.ClassNotPreparedException: 

[Ljava.lang.Object;@68fb2c38
The class study.util.StudyUtil not prepared for test.

クラス宣言にモック化するクラスを記述する必要があるみたい。

@RunWith(PowerMockRunner.class) //これと
@PrepareForTest({StudyUtil.class}) //これ
public class StudyUtilTest {
    
    @Test
    public void getTodayTest() {
        assertThat(StudyUtil.getToday(), is("20180131"));
    }
    
    @Test
    public void getTodayTest2() {
        
        PowerMockito.mockStatic(StudyUtil.class);
        PowerMockito.when(StudyUtil.getToday()).thenReturn("19270101");
        assertThat(StudyUtil.getToday(), is("19270101"));
    
    }

    @Test
    public void getTodayTest3() {
        
        PowerMockito.mockStatic(StudyUtil.class);
        PowerMockito.when(StudyUtil.getToday()).thenReturn("19270101");
        TestStudy ts = new TestStudy();
        //別のインスタンスメソッドから呼ばれても大丈夫
        String actual = ts.hello(); //※下記に参考クラス記述
        assertThat(actual, is("今日は19270101日"));
        
        //何度呼び出しても大丈夫
        assertThat(StudyUtil.getToday(), is("19270101"));
        
    }


}

テストクラスでインスタンス化したクラス(参考までに)

public class TestStudy {

    public String hello() {
        return hello("");
    }
    
    public String hello(String hello) {
        if (hello.isEmpty()) {
            return "今日は" + StudyUtil.getToday() + "日";
        }
        return hello + "!今日は" + StudyUtil.getToday(); 
    }
}