JUnit에서 private/protected 메서드에 액세스하는 메모
※ 소스 코드는 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));
}
}
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));
}
Reference
이 문제에 관하여(JUnit에서 private/protected 메서드에 액세스하는 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stkdev/items/622e389e9387b75f99ad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@Test
public void プロテクテッドメソッド(){
//直接参照可能
assertEquals(3, obj.protectedMethod(1));
}
Reference
이 문제에 관하여(JUnit에서 private/protected 메서드에 액세스하는 메모), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/stkdev/items/622e389e9387b75f99ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)