回答

收藏

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

技术问答 技术问答 238 人阅读 | 0 人回复 | 2023-09-12

如何使用 JUnit 测试内部私有方法、字段或嵌套类?
+ }; t' H7 s, c4 X更改方法的访问修改符似乎很糟糕,以便进行测试。
, B3 a* l# h. T5 `# b6 A                                                                $ p" S) L9 t" C
    解决方案:                                                               
; t5 e5 m- @6 f$ d0 q5 C' y                                                                更新:) O4 a9 @& b, O5 j1 K: \: M) d, I
大约10年后,也许是测试私人方法或任何无法访问的成员的最佳方法@Jailbreak从歧管框架。
& E2 T- d7 ?& z+ i$ tjava@Jailbreak Foo foo = new Foo();// Direct,*type-safe* access to *all* foo's membersfoo.privateMethod(x,y,z);foo.privateField = value;  h4 [- D, H$ C3 |
这样,您的代码就保持了类型的安全性和可读性。没有设计妥协,没有过度曝光测试的方法和领域。
5 W& l. x# R3 a! H6 J( a假如你有一些遗留物Java在不允许改变方法可见性的情况下,测试私有方法的最佳方法是使用反射。
# E5 k! h  H+ h5 O$ _  P在内部,我们使用助手获取/设置private和private static变量及调用private和private static方法。以下模式将使您几乎所有与私私人方法和字段相关的事情。当然,你private static final变量不能通过反射来改变。
/ q/ o+ O7 W, X' Q
    Method method = TargetClass.getDeclaredMethod(methodName,argClasses);method.setAccessible(true);return method.invoke(targetObject,argObjects);, i  I  k; q- g: a2 U0 o+ x+ A0 T3 Y) m2 L
对于字段:
% m1 m' m; f' d( A
    Field field = TargetClass.getDeclaredField(fieldName);field.setAccessible(true);field.set(object,value);
    1 p7 M0 m4 {$ D" Y7 C9 V! _
注意事项:
) U' O9 i% y/ h; y4 X1.TargetClass.getDeclaredMethod(methodName,argClasses)让您查看private方法。同样的事情适用于 getDeclaredField.9 O2 d+ Z; h* }1 \6 C
2.setAccessible(true)需要和私人玩。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则