Java mockito如何创建mock对象的实例

Java mockito如何创建mock对象的实例,java,testing,constructor,mockito,Java,Testing,Constructor,Mockito,当我创建一个模拟对象时,比如说类Employee。它不调用Employee对象的构造函数。我知道Mockito在内部使用CGLIb和反射,创建一个代理类,将该类扩展到mock。如果它不调用employee的构造函数,那么employee类的模拟实例是如何创建的?Mockito正在使用反射和CGLib来使用动态创建的超类扩展employee类。作为这项工作的一部分,它首先将Employee的所有构造函数设置为公共的-包括默认构造函数,如果您声明了一个使用参数的构造函数,则默认构造函数仍然存在,但为

当我创建一个模拟对象时,比如说类Employee。它不调用Employee对象的构造函数。我知道Mockito在内部使用CGLIb和反射,创建一个代理类,将该类扩展到mock。如果它不调用employee的构造函数,那么employee类的模拟实例是如何创建的?

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);
    }
}
public T imposterise(最终方法拦截器拦截器、类mockedType、类…辅助类型){
试一试{
setConstructorsAccessible(mockedType,true);
Class proxyClass=createProxyClass(mockedType,辅助类型);
返回mockedType.cast(createProxy(proxyClass,interceptor));
}最后{
setConstructorsAccessible(mockedType,false);
}
}
私有void setConstructorsAccessible(类mockedType,布尔可访问){
for(构造函数:mockedType.getDeclaredConstructors()){
constructor.setAccessible(可访问);
}
}

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

Mockito使用CGLib生成类对象。然而,为了实例化这个类对象,它使用对象化


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

我认为最好的办法是查看源代码。据我所知,模拟类的创建似乎发生在类ClassImposterizer中的方法“importise”中。下面是指向上述类的链接:它在任何时候都不会调用默认构造函数。谢谢,我对此很好奇。Mockito调用生成类的构造函数(大概是为了避免调用目标类型的构造函数的副作用)Objenesis的链接断开。显然,他们转移到了新域,项目现在在github上。我修复了链接