alibaba / testable-mock

换种思路写Mock,让单元测试更简单
https://alibaba.github.io/testable-mock/
MIT License
1.83k stars 310 forks source link

如何mock私有内部类 #305

Closed bingyangJavaLearning closed 1 year ago

bingyangJavaLearning commented 1 year ago

请问一下私有内部类如何mock? demo中DemoInnerClass里的内部类是public的。修改为private就不能在Mock容器中指定targetClass了。这种情况怎么mock呢? 例如如下代码,如何mock内部类Inner里的demo方法: public class DemoInnerClass { private class Inner { /**

linfan commented 1 year ago

目前的@MockInvoke确实表达不了对私有内部类方法的引用,需要对语法稍微扩展一下。

计划增加@MockInvoke(targetMethod = "com.alibaba.demo.basic.DemoInnerClass.Inner::demo")这种表达方式,通过包含类路径的完整方法名来引用私有内部类的方法。

预计在下个小版本里就能支持。

linfan commented 1 year ago

已发布v0.7.9版本通过@MockInvoke注解新增的targetClassName属性支持引用私有内部类,注意内部类和外部类名中间需要用"$"符号(而不是在Java代码里使用的"."符号)。比如外部类是com.demo.OuterClassInnerClass,则参数值为targetClassName = "com.demo.OuterClass$InnerClass"

"$"是在字节码里分隔内部类的表示方式,由于从Java类路径转换到字节码类路径比较繁琐,这里暂时保留原始的字节码路径,未来在大版本更新(如0.8.01.0.0版本)的时候可能会调整。