如何从另一个包中的超类测试受保护的继承方法

时间:2019-02-20 16:17:36

标签: java

我有抽象类和子类:

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中具有受保护的访问。有什么方法可以测试此方法(它是另一个包中超类的继承方法),同时将AImpAImpTest保留在myOtherPackage中,并且也将超类保留在自己的内部包装?

2 个答案:

答案 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)