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关键字,您可以创建所谓的包私有方法,该方法只能由同一包中的其他类接收。这使您可以在可以调用方法的同一个包中创建单元测试类,但也提供封装,因此使用您的类的客户端无法调用这些方法。