一尘不染

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

javascript

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

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


阅读 177

收藏
2022-01-23

共1个答案

一尘不染

更新:

大约10年后,也许是为了测试一个私有方法,或任何无法访问的成员的最好方法,是通过@Jailbreak歧管框架。

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

这样你的代码就保持了类型安全和可读性。没有设计妥协,没有为了测试而过度曝光的方法和领域。

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

在内部,我们使用助手来获取/设置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);

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

2022-01-23