背景
今日JUnitで書かれたテストコードを見ていたらprivateメソッドのテストが書かれていなかった。privateメソッドを呼び出すサンプルを作ったので投稿しようかと思いました。
追記
詳しくは@Kilisame様のコメントを参照して頂きたいのですが、privateのテストを忘れてたからテストしました、と言う主旨の記事ではありません。呼び出し側のpublicのテストが出来ないと言うか大変と言うか....(お察し頂きたい)感じなので、せめてprivateのテストをしたくて書いてみました。
コード
import static org.junit.Assert.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
/** サンプルクラス*/
public class private_Test {
public class Sample{
private int fuge(int i) {
return i;
}
}
@Test
public void test() {
Sample sample = new Sample();
try {
Method method = Sample.class.getDeclaredMethod("fuge", int.class);
method.setAccessible(true);
int rtn = (int)method.invoke(sample, 2);
assertEquals(2,rtn);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
getDeclaredMethod()メソッドでメソッドを取得し、setAccessible(true)で外部アクセスを許可、method.invoke()で実行できます。