mockito如何创建模拟对象的实例

当我创建一个类Employee的模拟对象。 它不会调用Employee对象的构造函数。 我知道内部Mockito使用CGLIb和reflection,创建一个代理类,将类扩展为mock。 如果它没有调用employee的构造函数,那么employee类的mock实例是如何创建的?

Mockito使用CGLib生成类对象。 但是为了实例化这个类对象,它使用了Objenesis http://objenesis.org/tutorial.html

Objenesis能够使用各种技术(即调用ObjectStream.readObject等)在没有构造函数的情况下实例化对象。

Mockito使用reflection和CGLib来扩展Employee类,并使用动态创建的超类。 作为其中的一部分,它首先使Employee的所有构造函数都公开 – 包括默认构造函数,如果您声明了一个带参数的构造函数,它仍然是私有的但是私有的。

public  T imposterise(final MethodInterceptor interceptor, Class mockedType, Class... ancillaryTypes) { try { setConstructorsAccessible(mockedType, true); Class proxyClass = createProxyClass(mockedType, ancillaryTypes); return mockedType.cast(createProxy(proxyClass, interceptor)); } finally { setConstructorsAccessible(mockedType, false); } } private void setConstructorsAccessible(Class mockedType, boolean accessible) { for (Constructor constructor : mockedType.getDeclaredConstructors()) { constructor.setAccessible(accessible); } } 

我假设它在创建超类时调用默认构造函数,尽管我没有测试过。 您可以通过声明私有默认构造函数Employee()并在其中放入一些日志来自行测试。