privateなメソッドのテスト
どうしても、privateなメソッドのテストをしなければいけなくなったのでメモ。
リフレクション使えばできるのかなと思ってたけど、やっぱできるみたい。
まず、テスト対象クラス。
PrivateOnlyClass.java
package sample; public class PrivateOnlyClass { private int privateField; private void privateMethod() { System.out.println(privateField); } }
次にテストクラス
PrivateOnlyClassTest.java
package sample; import static org.junit.Assert.assertEquals; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; public class PrivateOnlyClassTest { @Test public void testPrivateMethod() throws Exception { PrivateOnlyClass privateOnlyClass = new PrivateOnlyClass(); Class sampleClass = privateOnlyClass.getClass(); // プライベートプロパティを取得 Field field = sampleClass.getDeclaredField("privateField"); // アクセス可能にする field.setAccessible(true); // 値を取得して、テスト assertEquals(0, field.getInt(privateOnlyClass)); // プライベートメソッドを取得 Class[] params = new Class[] {}; Method method = sampleClass.getDeclaredMethod("privateMethod", params); // アクセス可能にする method.setAccessible(true); // メソッドコール method.invoke(privateOnlyClass, null); } }
あと、junit-addonsっていうライブラリ使うと簡単にprivateメソッドのテストができるみたい。
参考:http://www.emuaki.com/wiki/index.php?Java%20memo#f533b708
jxUnit使ってもできるのかな?
使えるライブラリが限られてるから、多分リフレクション使ってテストケース書く事になりそう。