关于java:将私有方法设置为非私有是否可以,因为它更容易进行测试?

Is it OK to make a private method to non-private just because to make it easier for testing?

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

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

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

更新:

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

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

我们需要修复一些错误,但如果没有测试我们就无法做到。因此,我们首先将一些相关代码提取到某些方法,为它们添加测试,然后修复错误。

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

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

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

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


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


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

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


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