如何测试具有私有方法、字段或内部类的类?

2022-08-31 01:24:37

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

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


答案 1

如果您具有某种遗留的 Java 应用程序,并且不允许更改方法的可见性,则测试私有方法的最佳方法是使用反射

在内部,我们使用帮助器来获取/设置和变量以及调用和方法。以下模式将允许您执行与私有方法和字段相关的几乎所有操作。当然,你不能通过反射来改变变量。privateprivate staticprivateprivate staticprivate 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);

笔记:

  1. TargetClass.getDeclaredMethod(methodName, argClasses)让您研究方法。同样的事情也适用于 .privategetDeclaredField
  2. 需要与私人一起玩。setAccessible(true)

答案 2

测试私有方法的最佳方法是通过另一个公共方法。如果无法执行此操作,则满足下列条件之一为真:

  1. 私有方法是死代码
  2. 您正在测试的类附近有设计气味
  3. 您尝试测试的方法不应是私有的

推荐