Как mockito создает экземпляр фиктивного объекта

Когда я создаю фиктивный объект, говорит класс Сотрудник. Это не вызывает конструктора объекта Сотрудника. Я знаю внутренне, что Mockito использует CGLIb и отражение, создает прокси-класс, который расширяет класс для насмешки. Если это не вызывает конструктора сотрудника, как ложный экземпляр класса сотрудника создан?

7
задан Cshah 29 June 2010 в 05:47
поделиться

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 () и добавив в него некоторый логин.

1
ответ дан 7 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: