【问题标题】:How can we test package-private class?我们如何测试包私有类?
【发布时间】:2017-07-04 12:04:25
【问题描述】:

我正在看书Effective Java,在Item 13: Minimize the accessibility of classes and members,它提到:

为了便于测试,您可能想使类、接口或成员更易于访问。这在一定程度上很好。将公共类包的私有成员设为私有以对其进行测试是可以接受的,但将可访问性提高到更高的水平是不可接受的。换句话说,将类、接口或成员作为包的导出 API 的一部分以方便测试是不可接受的。

我知道我们应该封装成员,向客户端隐藏信息,我们可以通过使用 setter 和 getter 访问类来测试它们,但是 我应该如何理解 make class package-private 可访问,如果可以如何测试它?

【问题讨论】:

    标签: java unit-testing testing


    【解决方案1】:

    基本上,这意味着您的测试器类应该与您的测试类位于同一个包中。这将使您的测试类和所有受包保护的成员和方法可供您的测试类访问。这些类可能位于不同的根目录下:您的测试类可能位于src/main/java/myrootpackage/first/second/MyClass.java 下,您的测试类可能位于src/test/java/myrootpackage/first/second/MyClassTester.java 下。

    【讨论】:

    • 这是有道理的,并且可能是对包私有类进行测试的唯一方法。谢谢! +1
    • 我目前的设置遵循src.main.java.myrootpackage.first.MyClass.javasrc.test.java.myrootpackage.first.test.MyClassTest.java,但是测试类找不到源类。如果我删除test 并将测试用例放在src.test.java.myrootpackage.first.MyClassTest.java 下,那么它可以工作。
    • 您是对的,如果您要测试的方法被定义为受保护(或包私有,即没有关键字),那么您的测试类必须在同一个包中。在您的设置中,路径“src.main.java”和“src.test.java”的一部分不是包的一部分。因此,您的课程在包“myrootpackage.first”中,您的测试课程在“myrootpackage.first.test”中。一旦你将你的测试类移动到“myrootpackage.first”中,它就会看到你的类的受保护或包私有成员。你也可以在你的类“package myrootpackage.first”的第一行看到这个包
    • 对于您的班级和您的测试班,这些必须相同
    • 在 C# 中,包保护是内部的,您可以轻松地将其公开给您的测试项目,只需在您的实际代码包项目中键入 [assembly:InternalsVisibleTo("MyTests")]。我希望Java也有一个。如果您在第 75 页进一步阅读,Joshua 说:“幸运的是,这也不是必需的,因为可以将测试作为被测试包的一部分运行,从而获得对其包私有元素的访问权限。”我认为现阶段没有任何可能。
    【解决方案2】:

    我猜作者的意思是,而不是

    package my.package;
    
    class TestableClass {
         private String property;
    }
    

    您可以将可见性更改为

    package my.package;
    
    class TestableClass {
        String property;
    }
    

    使用第二个实现,您可以从 my.package 包中的测试中访问该属性

    package my.package;
    
    class TestableClassTest {
        // ...
    }
    

    同时,子类无法访问该属性 - 这是与 protected 相比的好处。

    【讨论】:

    • 迈克尔,感谢您的回复。我已经考虑过这一点,但是自动运行所有测试并不方便。不幸的是,不可能将测试类文件分离到不同的包中。为你 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多