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?.
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
B
and C
are mocked object that you injected in your class A
using parametrized constructor.spy
of A
called spyA
.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
.