如何使用 JUnit 测试具有内部私有方法、字段或嵌套类的类?
为了能够运行测试而更改方法的访问修饰符似乎很糟糕。
更新: 大约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; 这样你的代码就保持了类型安全和可读性。没有设计妥协,没有为了测试而过度曝光的方法和领域。
更新:
大约10年后,也许是为了测试一个私有方法,或任何无法访问的成员的最好方法,是通过@Jailbreak从歧管框架。
@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应用程序,并且不允许更改方法的可见性,那么测试私有方法的最佳方法是使用反射。
在内部,我们使用助手来获取/设置private和private static变量以及调用private和private static方法。以下模式将让您做几乎所有与私有方法和字段相关的事情。当然,你private static final不能通过反射来改变变量。
private
private 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)需要和私人一起玩。
TargetClass.getDeclaredMethod(methodName, argClasses)
getDeclaredField
setAccessible(true)