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

时间:2010-06-29 05:47:57

标签: java testing constructor mockito

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

2 个答案:

答案 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()并在其中添加一些日志来自行测试。