Powermock WhiteBoxでprivateメソッドをテスト


はじめに

Junitテストケースを書く際に、privateメソッドのテストコードを比較的に書きにくいです。
invokeで書くのは一般的ですが、PowermockのWhiteBoxのメソッドを使うと便利です。

Invokeのテスト例

メソッド

public class UserUtil {
  private String getYourName(String lastName, String firstName) {
    return lastName + " " + firstName;
  }
}

テストコード

import static org.junit.Assert.assertEquals;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class UserUtilTest {

  @Test
  public void getYourName_useInvoke()
      throws NoSuchMethodException, SecurityException, IllegalAccessException,
          IllegalArgumentException, InvocationTargetException {

    UserUtil userUtil = new UserUtil();

    Method method = UserUtil.class.getDeclaredMethod("getYourName", String.class, String.class);
    method.setAccessible(true);

    String actual = (String) method.invoke(userUtil, "山田", "太郎");

    assertEquals("山田 太郎", actual);
  }
}

テストコードはちょっと長いです。

Powermock WhiteBoxの使う例

Powermockとは

staticメソッド、privateメソッドのmockをしやすくなります。

powermock-reflectとは

Gradleにpowermock-reflectを追加

build.gradle
    // https://mvnrepository.com/artifact/org.powermock/powermock-reflect
    testImplementation group: 'org.powermock', name: 'powermock-reflect', version: '2.0.9'

WhiteBoxのテスト例

  @Test
  public void getYourName_useWhiteBox() throws Exception {

    UserUtil userUtil = new UserUtil();

    String actual = (String) Whitebox.invokeMethod(userUtil, "getYourName", "山田", "太郎");

    assertEquals("山田 太郎", actual);
  }

簡潔に記載できました。

そのたメソッド

以上