Java의 Private 메소드 및 필드에 액세스하는 방법

10915 단어 JUnit자바
주로 자신이 불갑이 없는 탓에 Java를 2주일 정도 방치하고 있었습니다만, 개발도 가경에 돌입할 뿐 JUnit로 테스트 응베! 라고 분발해, 액세스 수식자가 Private 의 메소드나 필드 변수를 사용하려고 해도 당연히 다른 클래스로부터는 부를 수 없는 것에서( ^ω^)・・・

하지만 뭐 여러가지 조사해 보면 할 수 있어 메모해 둡니다.
원한다면 기름을 바르십시오.

사용 환경:
OS:Windows 10
자바 ver:8
IDE:eclipse 4.6 Neon

Jar 파일을 다운로드하자.



외부 사이트( htps : // 그럼. 오 sd. 네 t/p 로지ぇcts/sf )
에서 junit-addons Jar 파일을 가져옵니다.

매우 로컬 디렉토리에 저장하십시오.

Jar 파일을 추가하자.



eclipse를 시작하고 패키지 탐색기에서 마우스 오른쪽 버튼을 클릭하고 빌드 경로 → 빌드 경로 구성 → java 빌드 경로에서 외부 Jar를 추가합니다.



이것으로 준비 완료.

덧붙여서 API 사양은 어떤 느낌?



흠흠.

전혀 모르겠어.

말하자면 구루센세!

엉망진창 이동



테스트 프로그램을 준비합니다.
우선은 테스트 대상의 프로그램으로부터.

Sample.java
public class Sample {

//  privateなフィールド変数
    private int x = 10;

//  privateでstaticなフィールド変数
    private static int y = 20;

//  privateなメソッド
    private String testMethod(String x){

        return x;
    }

//  privateでstaticなメソッド
    private static String testStaticMethod(String y, String z){

        return y + z;
    }

}

그런 다음 JUnit 용 클래스 파일을 준비합니다.

SampleTest.java
import static org.junit.Assert.*;

import org.junit.Test;

import junitx.util.PrivateAccessor;

public class SampleTest {

    @Test
    /**
     * privateのフィールド、メソッドにアクセスするテスト関数
     */
    public void privateGetField() throws Throwable {
        Sample sample = new Sample();

        try {

//          privateなフィールド変数にアクセスするためのメソッド。
//          第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド変数名
            int x = (int)PrivateAccessor.getField(sample, "x");

//          アサーションにより実測値と期待値を比較
            assertEquals(x,10);

//          privateでstaticなフィールド変数も同様の手法でアクセスできる。説明省略
            int y = (int)PrivateAccessor.getField(sample, "y");
            assertEquals(y,20);


//          privateな関数にアクセスするためのメソッド。
//          第一引数:テスト対象クラスのインスタンス変数 第二引数:アクセスしたいフィールド関数名
//          第三引数:引数の型の配列 第四引数:引数の値の配列
            String method_x = (String)PrivateAccessor.invoke(   sample,
                                                                "testMethod",
                                                                new Class[]{String.class},
                                                                new Object[]{"private_x"});
            assertEquals(method_x,"private_x");

//          privateでstaticな関数も同様の手法でアクセスできる。引数の型の数に応じて第三、第四引数を工夫すること
            String method_y = (String)PrivateAccessor.invoke(   sample,
                                                                "testStaticMethod",
                                                                new Class[]{String.class,String.class},
                                                                new Object[]{"private_","static_y"});
            assertEquals(method_y,"private_static_y");


        } catch (NoSuchFieldException e) {

            e.printStackTrace();

        }finally{

        }
    }
}

실행



도야!



할 수 있었다!



private인 필드 변수에 값을 세트할 수도 버리거나.

SampleTest.java

//途中省略

    @Test
    /**
     * privateなフィールド変数に値をセットする関数
     */
    public void privateSetField(){

        Sample sample = new Sample();

        try {

//          第一引数:テスト対象クラスのインスタンス変数 第二引数:変数の名前
//          第三引数: セットしたい値
            PrivateAccessor.setField(sample, "x", 100);

//          セットできたか確認!
            int get_x = (int)PrivateAccessor.getField(sample, "x");
            assertEquals(get_x,100);

        } catch (NoSuchFieldException e) {

            e.printStackTrace();

        }finally{

        }
    }



좋은 웹페이지 즐겨찾기