Как mockito создает экземпляр фиктивного объекта - PullRequest
7 голосов
/ 29 июня 2010

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

Ответы [ 2 ]

6 голосов
/ 17 января 2011

Mockito использует CGLib для генерации объекта класса. Однако для создания экземпляра этого объекта класса используется Objenesis http://objenesis.org/tutorial.html

Objenesis может создавать экземпляры объекта без конструктора, используя различные методы (т.е. вызывая ObjectStream.readObject и аналогичные).

1 голос
/ 30 июня 2010

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 () и добавив в него некоторую запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...