我有抽象类和子类:
A.java:
package myPackage;
import java.util.ArrayList;
import java.util.List;
public abstract class A {
protected abstract int getInt();
protected List<Integer> get10Int() {
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 10; i++){
list.add(getInt());
}
return list;
}
}
AImp.java:
package myOtherPackage;
import myPackage.A;
public class AImp extends A {
@Override
protected int getInt(){
return 1;
}
}
我在与子类相同的程序包中定义一个测试:
package myOtherPackage;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class AimpTest {
@Test
public void testProtectedMethodFromSuperClass(){
AImp aimp = new AImp();
assertEquals(aimp.get10Int().size(), 10);
}
}
,我得到一个错误,因为get10Int()
在myPackage.A
中具有受保护的访问。有什么方法可以测试此方法(它是另一个包中超类的继承方法),同时将AImp
和AImpTest
保留在myOtherPackage
中,并且也将超类保留在自己的内部包装?
答案 0 :(得分:2)
我将亲自为A类创建一个测试,在您的测试中使用虚拟实现,然后测试您的功能。这样,就不需要在每个实现中都进行测试。
答案 1 :(得分:0)
我同意另一个答案,因为您应该为程序包中的类A
编写一个Test,因为您要测试的是A
而不是AImp
的功能,但是如果您真的想访问受保护的(甚至是私有的)方法,可以这样做:
@Test
public void testProtectedMethodFromSuperClass(){
AImp aimp = new AImp();
Method get10IntMethod = AImp.class.getDeclaredMethod("get10Int");
get10IntMethod.setAccessible(true);
List<Integer> result = (List<Integer>) get10IntMethod.invoke(aimp);
assertEquals(result.size(), 10);
}
如果您要使用参数调用方法(例如otherMethod(int)
),则必须将参数类型传递给getDeclaredMethod()
,如下所示:getDeclaredMethod("otherMethod", int.class)
以及要调用的参数:method.invoke(instance, 5)
。