When i create a mock object of say class Employee. It doesnt call the constructor of Employee object. I know internally Mockito uses CGLIb and reflection, creates a proxy class that extends the class to mock. If it doesnt call the constructor of employee how is the mock instance of employee class created ?
A:
Mockito is using reflection and CGLib to extend the Employee class with a dynamically created superclass. As part of this, it starts by making all the constructors of Employee public - including the default constructor, which is still around but private if you declared a constructor which takes parameters.
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);
}
}
I presume that it calls the default constructor when the superclass is created, though I haven't tested that. You could test it yourself by declaring the private default constructor Employee() and putting some logging in it.
Lunivore
2010-06-30 13:00:52
It never calls the default constructor at any time.
Cshah
2010-07-02 09:37:48
Thank you, I was curious about that.
Lunivore
2010-07-05 07:51:18
Mockito calls the constructor of the generated class (presumably to avoid side effects of calling the constructor of the target type)
iwein
2010-10-02 03:52:13