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

仅仅为了能够运行测试而更改方法的访问修饰符似乎不太好.

推荐答案

Update:

大约10年后,也许测试私有方法或任何无法访问的成员的最佳方法是通过Manifold框架中的101.

@Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;

这样,您的代码就保持了类型安全和可读性.没有设计妥协,没有为了测试而过度expose 方法和字段.

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

在内部,我们使用帮助器来获取/设置privateprivate static变量,以及调用privateprivate static方法.下面的模式几乎可以让您执行与私有方法和字段相关的任何操作.当然,您不能通过反射更改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:

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

只需最少的代码更改即可将版本号标记添加到日志(log)

Spring Data JPA慢慢地创建了太多非活动会话

为什么Java编译器不区分不同类型的方法?

Spring Security不允许加载js

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

在Java中将int[]矩阵添加到ArrayList中,但出现错误

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

Groovy/Java:匹配带引号的命令选项

Dijkstra搜索算法的实现

泛型与泛型问题的完美解决方案?

我的代码是线程安全的吗?[Java、CAS、转账]

如何使用Java ZoneID的区域设置?

如何在Spring Security中设置一个任何人都可以打开的主页?

如何设置默认序列生成器分配大小

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

";重复键的值提示唯一约束«;livre_genre_pkey»";例外

如何在Java上为循环数组从synchronized迁移到ReentrantLock