为什么我可以在测试中访问受保护的方法?

8

假设我有一个类,就像这样:

public class ClassA
{
    [...]

    protected void methodIWantToTest()
    {
        [...]
    }

    [...]
}

当我在IntelliJ Idea 13中编写单元测试时,如果我写下类似如下的代码,编译器不会报错:

public class ClassATest
{
    @Test
    public void test()
    {
        final ClassA objectUnderTest = new ClassA();

        objectUnderTest.methodIWantToTest(); // Why can I access a protected method here?
    }
}

methodIWantToTest 是受保护的方法。为什么我可以在测试中访问它?


在同一包中创建一个测试。即使它们在不同的项目中,它们也可以属于同一包。 - Leo
3个回答

14

由于这些类在同一个包中(尽管位于不同的文件夹中)。与子类一样,在相同包中的类可以访问受保护的方法。


8

这不是JUnit的奇怪现象,也与IDE无关。它只是protected在类位于同一包中时所做的事情(很可能您必须这样做)。

Access Levels
Modifier    Class   Package Subclass World
public      Y       Y       Y        Y
protected   Y       Y       Y        N
no modifier Y       Y       N        N
private     Y       N       N        N

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

这与其他语言如c#protected定义不同,其中protected仅表示该类及其子类型。

在Java中,protected关键字被用于指定仅由其位于同一包中或由其子类的方法访问的成员。

此功能可帮助确保代码安全性和可靠性。


0

受保护的访问修饰符: 在超类中声明为受保护的变量、方法和构造函数只能被其他包中的子类或受保护成员类所在包中的任何类访问。

受保护的访问修饰符不能应用于类和接口。可以声明受保护的方法和字段,但是接口中的方法和字段不能声明为受保护的。

受保护的访问使子类有机会使用辅助方法或变量,同时防止非相关类尝试使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接