Search code examples
javamockitojunit4

why cannot we create spy for Parameterized Constructor using Mockito


I have only parameterized constructor in my code and i need to inject through it.

I want to spy parameterized constructor to inject mock object as dependency for my junit.

public RegDao(){
 //original object instantiation here
Notification ....
EntryService .....
}

public RegDao(Notification notification , EntryService entry) {
 // initialize here
}

we have something like below : 
RegDao dao = Mockito.spy(RegDao.class);

But do we have something that i can inject mocked object in the Constructor and spy it?.


Solution

  • You can do that by instantiating your main class with parametrized constructor in your junit and then creating a spy from it.

    Let's suppose your main class is A. Where B and C are its dependencies

    public class A {
    
        private B b;
    
        private C c;
    
        public A(B b,C c)
        {
            this.b=b;
            this.c=c;
        }
    
        void method() {
            System.out.println("A's method called");
            b.method();
            c.method();
            System.out.println(method2());
    
        }
    
        protected int method2() {
            return 10;
        }
    }
    

    Then you can write junit for this using your parametrized class as below

    @RunWith(MockitoJUnitRunner.class)
    public class ATest {
    
        A a;
    
        @Mock
        B b;
    
        @Mock
        C c;
    
        @Test
        public void test() {
            a=new A(b, c);
            A spyA=Mockito.spy(a);
    
            doReturn(20).when(spyA).method2();
    
            spyA.method();
        }
    }
    

    Output of test class

    A's method called
    20
    
    1. Here B and C are mocked object that you injected in your class A using parametrized constructor.
    2. Then we created a spy of A called spyA.
    3. We checked if spy is really working by modifying the return value of a protected method method2 in class A which could not have been possible if spyA was not an actual spy of A.