java - 仅仅为了更容易测试而将私有(private)方法变为非私有(private)方法可以吗?

标签 java unit-testing private

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

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

但它使一些本应是“私有(private)”的方法成为非私有(private)的。这样做可以吗,或者有更好的解决方案吗?


更新:

我认为我最好提供更多背景信息:

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

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

由于提取的方法默认是私有(private)的,所以我们必须将它们设为非私有(private),否则我们必须通过反射调用它们:

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

但是如果我们将其设为非私有(private),我们就可以:

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

最佳答案

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

关于java - 仅仅为了更容易测试而将私有(private)方法变为非私有(private)方法可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20164240/

相关文章:

c# - 如何在 C# 解决方案中引用不同文件夹中的文件

reactjs - 如何在创建 react 应用程序提交之前运行测试?

unit-testing - Kotlin Spek Framework 崩溃 w/Gradle

c++ - 无法在公共(public)方法中使用类型

Java 8 通用函数应该是模棱两可的,但在运行时失败

java - WebMvcAutoConfiguration 未激活

java - 动态联系信息数据/设计模式:这是否可行?

java - 即使用户强制关闭服务,如何启动服务?

api - Windows Phone 8 - 私有(private) API?

objective-c - 将属性和方法封装在框架头文件中