我认为 Mockito 通过使用动态代理来模拟界面。
然后我注意到调试时Mockito模拟接口的类型:
MyInterface$$EnhancerByMockitoWithCGLIB$$9654c88
表示使用 CGLIB 而不是动态代理。
有人可以:
答案 0 :(得分:1)
Mockito允许MockMaker的可互换实现,但默认情况下,实现是基于CGLib的CglibMockMaker。
有关CGLib和标准Proxy对象之间差异的在线讨论("The Power of Proxies in Java"或"What is the difference between JDK dynamic proxy and CGLib?");在模拟接口时,似乎Proxy完全没问题,但是使用CGLib可以访问带有实现的模拟实际类,并且在严格必要时提交CGLib可能会使代码更容易理解。
答案 1 :(得分:1)
在mockito-core模块的源代码中(我使用的是版本1.9.5),如果你遵循使用MockMaker
的代码(其中模块中唯一的实现是CglibMockMaker
) ,你会看到你到达一个名为ClassImposterizer
的班级。这个类包含一些Cglib魔法(正如评论明确指出的那样)。此外,您可以清楚地看到在私有方法Enhancer
createProxyClass