Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

インナークラスをテスト

はじめまして。

テストにて、privateなインナークラスに
アクセスする必要があるのですが・・・

下記ソースですと、インスタンスを生成できず
エラーになってしまい、
インスタンスの型をObjectにすると
java.lang.IllegalAccessException
・・・という状況です。

どなたか、アドバイス頂けると助かります。

□□□□□□□□□□□□□□□□□□□□□□□□□

package test002;

import java.lang.reflect.*;
import test001.Outer;

public class TestMain {
    
    public static void main(String[] args) throws Exception{
        
                Class clazz = Class.forName("test001.Outer$Inner");
        Constructor[] c = clazz.getDeclaredConstructors();
        Outer.Inner instance1 = (Outer.Inner)c[0].newInstance(new Object[] {new Outer()});
        Outer.Inner instance2 = (Outer.Inner)c[1].newInstance(new Object[] {new Outer(),new String("I am Inner(String)")});
//        Object instance1 = c[0].newInstance(new Object[] {new Outer()});
//        Object instance2 = c[1].newInstance(new Object[] {new Outer(),new String("I am Inner(String)")});
        System.out.println("c.length "+ c.length);
        
        for(int i = 0; i<c.length; i++){
            Object[] params = c[i].getParameterTypes();
            for(int j = 0; j<params.length; j++){
                System.out.println("c["+ i +"] : "+ params[j]);
            }
            
        }
        
        Method meth = clazz.getDeclaredMethod("getInnerString",new Class[]{});
        meth.setAccessible(true);
        System.out.println(meth.invoke(instance2,new Object[]{}));
        

        
        
    }

}

□□□□□□□□□□□□□□□□□□□□□□□□□

package test001;

public class Outer {
    
    private class Inner {
        
        Inner(){
            
        }
        
        Inner(String str){
            System.out.println("I am Inner.");
        }
        
        private String getInnerString(){
            return "innnerString";
        }
        
    }

}

□□□□□□□□□□□□□□□□□□□□□□□□□

2

回答

5503

閲覧

2件の回答

評価

0

(1)JUnitを使う。
(2)テストする時だけ、publicに書き換えておく。
(3)java.lang.reflectを使ってクラスを解析して、テスト用の一時クラスを生成し、テストする。

評価

0

方法1
アウタークラスにインナークラスの
インスタンスを取得するメソッドを用意する。

方法2
http://sengoku.ath.cx/java/contents/contents1/contents1_19.jsp

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。