当我创建一个类Employee的模拟对象时。它不会调用Employee对象的构造函数。我知道内部Mockito使用CGLIb和反射,创建一个代理类,将类扩展为mock。如果它没有调用employee的构造函数,那么如何创建employee类的mock实例?
答案 0 :(得分:6)
Mockito使用CGLib生成类对象。但是,要实例化此类对象,它使用Objenesis http://objenesis.org/tutorial.html
Objenesis能够使用各种技术(即调用ObjectStream.readObject等)在没有构造函数的情况下实例化对象。
答案 1 :(得分:1)
Mockito正在使用反射和CGLib来扩展Employee类,并使用动态创建的超类。作为其中的一部分,它首先使Employee的所有构造函数都公开 - 包括默认构造函数,如果你声明了一个带参数的构造函数,那么它仍然是私有的。
public <T> T imposterise(final MethodInterceptor interceptor, Class<T> 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()并在其中添加一些日志来自行测试。