0

我正在尝试为我的单元测试用例创建一个可重用的模板类。假设类 Sample 和 SampleTest 属于同一个包,而 Template 属于不同的包。实例化 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可以防止这种情况发生。因此,您不能直接调用这些方法,并且在您的情况下,您不能通过 Java Reflection API 调用这些方法。

正如建议的那样,一种解决方案是在构造函数上使用 setAccessible(true) 。

于 2013-02-11T09:26:47.033 回答
0

相反,我建议通过抽象方法将创建实例的责任交给子类。然后,您可以包装它以监视该实例。

于 2013-02-11T09:30:54.533 回答