Below we have class – ClassA which contains the actual method – MethodA to be tested. MethodA has call to two dependent
ClassA.java
package com.mugil.org; public class ClassA { public ClassADep1 dependency1; public ClassADep2 dependency2; public ClassA(ClassADep1 dependency1, ClassADep2 dependency2) { this.dependency1 = dependency1; this.dependency2 = dependency2; } public boolean MethodA(){ System.out.println("I am going to call Dep1Method"); dependency1.Dep1Method(); System.out.println("I am going to call Dep2Method"); dependency2.Dep2Method(); return true; } }
ClassADep1.java
package com.mugil.org; public class ClassADep1 { public void Dep1Method(){ System.out.println("This is ClassADep1 Method getting called"); } }
ClassADep2.java
package com.mugil.org; public class ClassADep2 { public void Dep2Method(){ System.out.println("This is ClassADep2 Method getting called"); } }
Use @Mock when you want to just test the functionality externally without actually calling that method.If you want to be safe and avoid calling external services and just want to test the logic inside of the unit, then use mock.
Using @Mock annotation for Dependency
ClassATest.java
package com.mugil.org; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.*; @ExtendWith({MockitoExtension.class}) class ClassATest { @InjectMocks ClassA classA; @Mock ClassADep1 dependency1; @Mock ClassADep2 dependency2; @Test void methodA() { assertEquals(true, classA.MethodA()); } }
Output
I am going to call Dep1Method I am going to call Dep2Method
Use @Spy when you want to test the functionality externally + internally with the very method being called. If you want to call an external service and perform calling of real dependencies, or simply say, you want to run the program as it is and just stub specific methods, then use spy.
Using @Spy annotation for Dependency
ClassATest.java
package com.mugil.org; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith({MockitoExtension.class}) class ClassATest { @InjectMocks ClassA classA; @Spy ClassADep1 dependency1; @Spy ClassADep2 dependency2; @Test void methodA() { assertEquals(true, classA.MethodA()); } }
Output
I am going to call Dep1Method This is ClassADep1 Method getting called I am going to call Dep2Method This is ClassADep2 Method getting called