是否可以将私有方法设置为非私有方法,因为它使测试更容易?

时间:2013-11-23 15:38:46

标签: java unit-testing private

我们正在维护一些遗留代码,我们正在为它们添加测试。

为了更容易编写测试,我们将一些代码提取到方法中(默认是私有的),然后为它们编写测试。由于它们是私有的,因此很难调用它们,因此我们所做的是:删除“private”关键字,使其成为“非私有”,然后编写测试。

但它使一些非私人的方法被认为是“私人的”。可以这样做,还是有更好的解决方案?


更新

我想我最好提供更多背景资料:

代码非常复杂且不好,几乎没有测试。编写公共方法的测试是不可能的,因为它们有很多硬编码的外部依赖项,并且不会被模拟。

我们需要修复一些错误,但如果没有测试我们就无法做到。所以我们首先从一些方法中提取一些相关的代码,为它们添加测试,然后修复bug。

由于默认情况下提取的方法是私有的,我们必须将它们设为非私有,否则我们必须通过反射来调用它们:

Method method = Somecls.class.getMethod("a-private-method");
method.setAccessible(true);
method.invoke(...)

但如果我们将其设为非私人,我们可以:

Somecls cls = new Somecls();
cls.nonPrivateMethod(...)

3 个答案:

答案 0 :(得分:3)

如果该方法是私有的,那么它将由该类中的公共方法调用。理想情况下,测试用例应该通过公共方法来访问该私有方法中的所有可能流。

答案 1 :(得分:1)

我认为这是非常个人化的。在大多数情况下,如果这有助于编写更好的单元测试,我认为将方法范围从private更改为protected / package private没有任何损害。它不仅允许从您的测试中调用方法 - 您可以使用反射进行任何一种方式 - 而且还可以在测试另一个方法时重写/模拟该方法。

但是,如果你不想这样做,你仍然可以使用像Spring's ReflectionTestUtils这样的工具来减少对私有方法的调用。

答案 2 :(得分:0)

是的,这对于为私有方法创建单元测试是完全可以接受的。通过省略private关键字,您可以创建所谓的包私有方法,该方法只能由同一包中的其他类接收。这允许您在可以调用方法的同一个包中创建单元测试类,但也提供封装,因此使用您的类的客户端无法调用这些方法。