Index: [Article Count Order] [Thread]

Date:  Wed, 6 Jun 2001 17:33:52 +0900
From:  "Hirohide Yazaki" <firo@....jp>
Subject:  [XP-jp:01983] Re: JUnit で private なメソッドのテスト
To:  <extremeprogramming-jp@....jp>
Message-Id:  <06df01c0ee63$6adb3de0$3701a8c0@FIRO>
References:  <20010606152723.B40B.NOBUYA@....jp>
X-Mail-Count: 01983

矢崎です。
プライベートメソッドのテストをやることの是非は別として、
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で楽しくやろう。
"}));
    }

}
=============================