我们如何测试包私有类?

时间:2017-02-15 17:13:16

标签: java unit-testing testing

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

  

为了便于测试,您可能想要使类,界面或成员更易于访问。这一点很好。为了测试公共类包私有成员是可以接受的,但是提高可访问性是不可接受的。换句话说,将类,接口或成员作为包的导出API的一部分以便于测试是不可接受的。

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

我猜作者的意思是代替

package my.package;

class TestableClass {
     private String property;
}

您可以将可见性更改为

package my.package;

class TestableClass {
    String property;
}

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

package my.package;

class TestableClassTest {
    // ...
}

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