我正在尝试为单元测试用例创建可重用的模板类。假设类Sample和SampleTest属于同一个包,而Template属于不同的包。我得到实例化Sample类的错误。我希望该方法将被执行,就好像它是SampleTest类的一个方法,可以访问Sample。有没有办法使这项工作?
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;
}
}
答案 0 :(得分:0)
Java阻止在不同的包中调用类的任何非公共方法(以及构造函数)。编译器和 JVM阻止了这种情况。 因此,您不能直接调用这些方法,并且,就像您的情况一样,您不能通过Java Reflection API调用这些方法。
如建议的那样,解决方案是在构造函数上使用setAccessible(true)。
答案 1 :(得分:0)
相反,我建议通过抽象方法负责创建实例到Sub-class。然后,您可以将其包装在该实例上进行间谍活动。