回答

收藏

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

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

如何使用 JUnit 测试内部私有方法、字段或嵌套类?$ U; ~0 T6 V& Y8 T9 X( [0 T' {9 @
更改方法的访问修改符似乎很糟糕,以便进行测试。+ A; ^& {4 a  Z3 F6 z
                                                                : ^, V& T+ H1 j9 N3 o7 n9 k
    解决方案:                                                               
, Q4 T! a9 M; _; ^7 }                                                                更新:
" q2 ]& _% \% |; ~% _- H大约10年后,也许是测试私人方法或任何无法访问的成员的最佳方法@Jailbreak从歧管框架。
' N" Q- P2 }" F2 k! d8 D+ g2 Wjava@Jailbreak Foo foo = new Foo();// Direct,*type-safe* access to *all* foo's membersfoo.privateMethod(x,y,z);foo.privateField = value;& R" j# h4 Y+ {) Z" m1 \3 C
这样,您的代码就保持了类型的安全性和可读性。没有设计妥协,没有过度曝光测试的方法和领域。6 M: ~+ t* W0 r2 U, Q; r
假如你有一些遗留物Java在不允许改变方法可见性的情况下,测试私有方法的最佳方法是使用反射。/ S* S% p! j5 i0 \1 o' o4 F
在内部,我们使用助手获取/设置private和private static变量及调用private和private static方法。以下模式将使您几乎所有与私私人方法和字段相关的事情。当然,你private static final变量不能通过反射来改变。2 Z* O" }, f2 c- s5 _: c9 i7 `2 I
    Method method = TargetClass.getDeclaredMethod(methodName,argClasses);method.setAccessible(true);return method.invoke(targetObject,argObjects);$ Z4 A9 ^+ V3 G* y- ], R
对于字段:9 |- h3 @4 j2 g' }8 b4 y5 }6 i
    Field field = TargetClass.getDeclaredField(fieldName);field.setAccessible(true);field.set(object,value);
    - g* z6 P' O+ a+ d/ O  J  Y* |
注意事项:! b( z  L3 `1 _6 a4 s, k* ?
1.TargetClass.getDeclaredMethod(methodName,argClasses)让您查看private方法。同样的事情适用于 getDeclaredField.
8 o0 B: O, A! I6 I# E( {2.setAccessible(true)需要和私人玩。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则