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

新手上路,请多包涵

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

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

原文由 MattGrommes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 877
2 个回答

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

Internally we’re using helpers to get/set private and private static variables as well as invoke private and private static methods.以下模式将使您可以执行与私有方法和字段相关的几乎所有操作。当然,你不能通过反射改变 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);


笔记:

  1. TargetClass.getDeclaredMethod(methodName, argClasses) 让你看看 private 方法。同样的事情适用于 getDeclaredField
  2. setAccessible(true) 需要和私人一起玩。

原文由 Cem Catikkas 发布,翻译遵循 CC BY-SA 4.0 许可协议

测试私有方法的最佳方式是通过另一个公共方法。如果无法做到这一点,则以下条件之一为真:

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

原文由 Sir Rippov the Maple 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题