JUnit에서 private/protected 메서드에 액세스하는 메모

6970 단어 JUnit자바
JUnit에 한정된 이야기는 아니지만 외부에서 리플렉션을 사용하여 private 메소드에 액세스하는 메모입니다.

※ 소스 코드는 JUnit4의 예입니다.

private 메소드에 액세스



테스트 대상



우선, 적당히 테스트 대상의 클래스를 만들어 보겠습니다.
package dammy;

public class Main {
    //プライベートフィールド
    private String name;

    //初期化
    Main(){
        name = "プライベート";
    }
    //プライベートメソッド
    private int privateMethod(int in){
        return in * 2;
    }
    //プロテクテッド
    protected int protectedMethod(int in){
        return in * 3;
    }
    //パブリック
    public int publicMethod(int in){
        return in * 4;
    }
}

처리로는 아무것도 의미가 없으므로 신경 쓰지 마십시오.

리플렉션으로 액세스


public class MainTest {
    private Main obj;

    @Before
    public void setUp() throws Exception {
        obj = new Main();
    }

    @After
    public void tearDown() throws Exception {
        obj = null;
    }

    //日本語でメソッド名書くとわかりやすい
    @Test
    public void プライベート変数を参照() throws Exception{
        //名前を指定して取得
        Field field = Main.class.getDeclaredField("name");
        //アクセス権限を与える
        field.setAccessible(true);
        //指定のインスタンス内のfieldを取得
        assertEquals("プライベート", (String)field.get(obj));
    }

    @Test
    public void プライベートメソッドを実行() throws Exception {
        //名前と引数を指定して取得
        Method method = Main.class.getDeclaredMethod("privateMethod", int.class);
        method.setAccessible(true);
        assertEquals(2,method.invoke(obj, 1));
    }

}
  • getDeclaredField()/Method() 에 의해 취득
  • setAccessible() 에서 액세스 가능
  • invoke에서 대상 인스턴스를 지정하여 실행

  • OK입니다.

    protected는 빌드 패스로 설정하면



    테스트 코드에서 protected 메서드에 액세스하는 경우 가장 쉬운 것은 테스트 대상과 동일한 패키지에 넣는 것입니다.그래서 소스 코드 관리가 번거롭습니다.
    테스트용 코드를 다른 디렉토리 내에 작성해 두고, 빌드 패스의 설정으로 소스 코드와 함께 지정해 두는 것으로 같은 패키지에 있도록(듯이) 취급할 수 있습니다.
    그림은 Eclipse의 예

    @Test
    public void プロテクテッドメソッド(){
        //直接参照可能
        assertEquals(3, obj.protectedMethod(1));
    }
    

    좋은 웹페이지 즐겨찾기