java - 如何测试具有私有(private)方法、字段或内部类的类?

标签 java unit-testing junit tdd

如何使用 JUnit 测试具有内部私有(private)方法、字段或嵌套类的类?

仅仅为了能够运行测试而更改方法的访问修饰符似乎很糟糕。

最佳答案

如果您有一些遗留的Java应用程序,并且不允许您更改方法的可见性,则测试私有(private)方法的最佳方法是使用 reflection .

在内部,我们使用助手来获取/设置 privateprivate static变量以及调用 privateprivate static方法。以下模式将允许您执行与私有(private)方法和字段相关的几乎所有操作。当然,你不能改变private static final通过反射变量。

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

对于字段:

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
<小时/>

Notes:

  1. TargetClass.getDeclaredMethod(methodName, argClasses) lets you look into private methods. The same thing applies for getDeclaredField.
  2. The setAccessible(true) is required to play around with privates.

关于java - 如何测试具有私有(private)方法、字段或内部类的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571/

相关文章:

java - JUnit - 一次在@Before 中启动的字段在测试中为空

java - 在 finally block 之前放置 return 语句是一个好习惯吗?

java - While(matcher.find()) - 错误 - 不起作用

javascript - 对使用 $translatePartialLoaderProvider 的 AngularJS 应用程序进行单元测试

java - 模拟与实现。如何在单个测试类中共享这两种方法?

java - 为什么 JUnit 测试方法需要无效?

java - 当与 JUnit 一起使用方法时,jdbcTemplate 为 null

使用带有输入和输出流的 ProcessBuilder 的 Java 程序不起作用

java - 枚举变量如何工作?

c++ - 生成用于测试的随机结构的通用方法