矢崎です。
プライベートメソッドのテストをやることの是非は別として、
reflectionを使えばテストできます。
例えば以下の
getNameAndMessage
getName
を、 テストしたいとします。
=============================
public class Target{
private String name = null;
public void setName(String name){
this.name = name;
}
private String getNameAndMessage(String name, String message){
return name + "さん今日は。" + " " + message + " " + this.name + "よ
り";
}
protected String getName(){
return this.name;
}
}
=============================
プライベートやプロテクティドのメソッドにアクセスするための
ユーティリティクラスを作ります。こいつがreflactionを使って
います。
=============================
import java.lang.reflect.*;
import java.lang.*;
public final class MethodExecutor{
public static Object execute(Object obj, String methodName, Class[]
parameterTypes, Object[] parameters)
throws NoSuchMethodException,
IllegalAccessException,
InvocationTargetException
{
Method method = obj.getClass().getDeclaredMethod(methodName,
parameterTypes);
method.setAccessible(true);
return method.invoke(obj, parameters);
}
}
=============================
で、上のクラスを使って、テストを書きます。
=============================
import junit.framework.*;
import java.lang.reflect.*;
import java.lang.*;
public class TargetTest extends TestCase{
private Target target;
public TargetTest(String name){
super(name);
}
protected void setUp(){
target = new Target();
}
public void testGetName() throws Exception{
target.setName("TARO");
assertEquals("TARO",(String)MethodExecutor.execute(target,
"getName", new Class[0], new Object[0]));
}
public void testGetNameAndMessage() throws Exception{
target.setName("HANAKO");
assertEquals("JIROさん今日は。 今日もXPで楽しくやろう。 HANAKOより",
(String)MethodExecutor.execute
(target,
"getNameAndMessage",
new Class[]{new String().getClass(), new
String().getClass()},
new Object[]{"JIRO","今日もXPで楽しくやろう。
"}));
}
}
=============================