0

単体テスト ケース用に再利用可能なテンプレート クラスを作成しようとしています。クラス Sample と SampleTest が同じパッケージに属し、Template が別のパッケージに属しているとします。Sample クラスのインスタンス化でエラーが発生します。このメソッドは、Sample にアクセスできる SampleTest クラスのメソッドであるかのように実行されると思います。これを機能させる方法はありますか?

public SampleTest extends Template<Sample> {
     public void testMethod() {
          getTarget().method();
     }
}

public class Template<T> extends TestCase {

    /** Spied, object instance to test. */
    private transient T targetObject;

    /** Test class type to be derived as parameter type of test subclass. */
    private transient final Class<T> targetType;

    @Override
    public void setUp() throws Exception
    {
        super.setUp();
        setupTargetObject();
    }

    protected void setupTargetObject()
    {
        final T realObject =  targetType.newInstance(); //ERROR here if class under test is non-public
        targetObject = Mockito.spy(realObject);
    }

    protected Template() {
            final ParameterizedType paramedType = (ParameterizedType) getClass().getGenericSuperclass();
            targetType = (Class<T>) paramedType.getActualTypeArguments()[0];
    }

    protected T getTarget()
    {
        return targetObject;
    }

}
4

2 に答える 2

0

Javaは、別のパッケージ内のクラスの非公開メソッド(したがって、コンストラクター)を呼び出さないようにします。これは、コンパイラJVMによって防止されます。したがって、これらのメソッドを直接呼び出すことはできません。また、あなたの場合のように、JavaReflectionAPIを介してこれらのメソッドを呼び出すことはできません。

解決策は、提案されているように、コンストラクターでsetAccessible(true)を使用することです。

于 2013-02-11T09:26:47.033 に答える
0

代わりに、抽象メソッドを介してサブクラスにインスタンスを作成する責任を与えることをお勧めします。その後、そのインスタンスをスパイするためにラップできます。

于 2013-02-11T09:30:54.533 に答える