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使ってもできるのかな?


使えるライブラリが限られてるから、多分リフレクション使ってテストケース書く事になりそう。