Pregunta

Cuando creo un objeto de burla de la clase Empleado por ejemplo. Eso no llama al constructor del objeto Employee. Sé internamente Mockito utiliza CGLIB y reflexión, crea una clase de proxy que amplía la clase de simulacro. Si no está de llama al constructor del empleado cómo está la instancia de la clase simulacro empleado creado?

¿Fue útil?

Solución

Mockito utiliza CGLIB para generar objeto de clase. Sin embargo para crear instancias de esta clase de objeto que utiliza Objenesis http://objenesis.org/tutorial.html

Objenesis es capaz de objeto instantiate sin constructor utilizando diversas técnicas (es decir, llamando ObjectStream.readObject y similar).

Otros consejos

Mockito está utilizando la reflexión y CGLIB extender la clase empleado con una superclase creada dinámicamente. Como parte de esto, se comienza por hacer todos los constructores de Empleados Públicos -. Incluyendo el constructor por defecto, que todavía está alrededor, pero privada si usted declaró un constructor que toma los parámetros

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);
    }
}

supongo que llama al constructor por defecto cuando se crea la superclase, aunque no he probado eso. Se podría probar por sí mismo al declarar el constructor por defecto Empleado privado () y poner un poco de la tala en ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top