LoginSignup
2
6

More than 3 years have passed since last update.

JUnitでprivateメソッドをテストする方法

Last updated at Posted at 2017-11-27

PHPのprivateとprotectedメソッドをPHPUnitでテストする方法はこちら

  • 環境
    • macOS Hight Sierra
    • Eclipse : Neon.3 Release (4.6.3)
    • JUnit : 4
テスト対象はprivateなメソッドです
/** 正規表現Util. */
public class SeikiHyogenUtil {
    /**
     * エスケープした記号を取得する.
     * @param kigo エスケープしていない記号.
     * @return エスケープした記号.
     */
    private String getEscapedKigo(String kigo) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < kigo.length(); i++) {
            String c = String.valueOf(kigo.charAt(i));
            sb.append(Matcher.quoteReplacement(c));
        }
        return sb.toString();
    }
}
privateなメソッドをテストする方法
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

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

import org.junit.Test;

/** SeikiHyogenUtilのテストクラス. */
public class SeikiHyogenUtilTest {
    SeikiHyogenUtil seikiHyogenUtil = new SeikiHyogenUtil();

    /**
     * テストメソッド本体.
     * @throws NoSuchMethodException
     * @throws SecurityException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    @Test
    public void getEscapedKigoは引数が$の場合にエスケープした$を返却すること() throws NoSuchMethodException, SecurityException,
            IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        String param = "$";
        String expected = "\\" + param;
        String actual = getEscapedKigoを実行する(param);
        assertThat(actual, is(expected));
    }

    /**
     * privateなメソッドを実行する.
     * @param kigo privateなメソッドの引数をそのまま引数にするとわかりやすい.
     * @return privateなメソッドの戻り値.
     * @throws NoSuchMethodException
     * @throws SecurityException
     * @throws IllegalAccessException invokeでthrowされる例外もそのままthrowします
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    private String getEscapedKigoを実行する(String kigo) throws NoSuchMethodException, SecurityException,
            IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        String methodName = "getEscapedKigo";
        Method method = privateメソッドを取得する(methodName);
       // method.invoke(インスタンス, 引数);で実行してメソッドの返却値に合わせて型変換する
        return (String) method.invoke(this.seikiHyogenUtil, kigo);
    }

    /**
     * privateなメソッドを取得する.
     * @param methodName privateなメソッドの名前.
     * @return privateなメソッド.
     * @throws NoSuchMethodException getDeclaredMethodでthrowされる例外はそのままthrowします
     * @throws SecurityException
     */
    private Method privateメソッドを取得する(String methodName) throws NoSuchMethodException, SecurityException {
        // クラス名.class.getDeclaredMethod(メソッドの名前, 引数の型);でメソッドを取得する
        Method method = SeikiHyogenUtil.class.getDeclaredMethod(methodName, String.class);
        // 外部からのアクセスを許可させる
        method.setAccessible(true);
        return method;
    }
}

privateなメソッドをテストする方法

① privateメソッドを取得する

  1. getDeclaredMethodを使ってメソッドを取得する
  2. setAccessibleで取得したメソッドのアクセスを許可させる
privateメソッドを取得する
        // クラス名.class.getDeclaredMethod(メソッドの名前, 引数の型);でメソッドを取得する
        Method method = SeikiHyogenUtil.class.getDeclaredMethod(methodName, String.class);
        // 外部からのアクセスを許可させる
        method.setAccessible(true);

② privateなメソッドを実行する

  1. ①で取得したメソッドのinvokeにクラスのインスタンスと必要な引数をわたして実行する
  2. invokeの返却値はObject型なのでメソッドの返却値に合わせて変換する
privateなメソッドを実行する
        Method method = privateメソッドを取得する(methodName);
       // method.invoke(インスタンス, 引数);で実行してメソッドの返却値に合わせて型変換する
        return (String) method.invoke(this.seikiHyogenUtil, kigo);

参考にさせていただいたサイト様

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6