2010-06-29 21 views
7

Cuando creo un objeto simulado de la clase say Employee? No llama al constructor del objeto Employee. Sé internamente que Mockito usa CGLIb y reflexión, crea una clase proxy que amplía la clase para simular. Si no llama al constructor del empleado, ¿cómo se crea la instancia simulada de la clase de empleado?¿Cómo crea mockito una instancia del objeto simulado

+1

Creo que su mejor opción sería mirar el código fuente. A mi entender, parece que la creación de clase falsa ocurre en el método "imposterizar" en la clase ClassImposterizer. Aquí está el enlace a la clase mencionada anteriormente: http://mockito.googlecode.com/svn/trunk/src/org/mockito/internal/creation/jmock/ClassImposterizer.java – sateesh

Respuesta

6

Mockito usa CGLib para generar objetos de clase. Sin embargo, para instanciar este objeto de clase utiliza Objenesis http://objenesis.org/tutorial.html

Objenesis es capaz de crear instancias de objetos sin constructor usando varias técnicas (es decir, llamando a ObjectStream.readObject y similares).

+0

enlace roto para Objenesis – bakoyaro

+2

Aparentemente se movieron a un nuevo dominio y el proyecto ahora está en github. Arreglé el enlace –

1

Mockito está utilizando reflection y CGLib para extender la clase Employee con una superclase creada dinámicamente. Como parte de esto, comienza haciendo que todos los constructores de Employee sean públicos, incluido el constructor predeterminado, que aún existe pero privado si se declara 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 predeterminado cuando se crea la superclase, aunque no lo he probado. Puede probarlo usted mismo al declarar el constructor predeterminado privado Employee() y ponerle un poco de registro.

+0

Nunca llama al constructor predeterminado en ningún momento. – Cshah

+0

Gracias, tenía curiosidad sobre eso. – Lunivore

+0

Mockito llama al constructor de la clase generada (presumiblemente para evitar los efectos secundarios de llamar al constructor del tipo de destino) – iwein

Cuestiones relacionadas