How does mockito create an instance of the mock object

前端 未结 2 545
无人及你
无人及你 2020-12-09 13:27

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 cl

相关标签:
2条回答
  • 2020-12-09 13:57

    Mockito uses CGLib to generate class object. However to instantiate this class object it uses Objenesis http://objenesis.org/tutorial.html

    Objenesis is able to instantiate object without constructor using various techniques (i.e. calling ObjectStream.readObject and similar).

    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题