Sunday, September 30, 2018

Power of Mockito.

1. Spy
@Spy

ClassToBTested classToBTested= new ClassToBTested();

2. Call RealMethod
@Mock mockedClass
when(mockedClass).doSomething(<AnyArg>).thenCallRealMethod.

3. Argument capturing:
ArgumentCaptor< ArgumentClass1 > captor1= ArgumentCaptor.forClass(ArgumentClass1.class);

ArgumentCaptor< ArgumentClass2> captor2 =ArgumentCaptor.forClass(ArgumentClass2.class);
classToBTested.testSomeMethod(someArgument);

Mockito.verify(classToBTested).doSometing(captor1.capture(), captor2.capture()));
ArgumentClass1 argumentObj1 = captor1.getValue();
ArgumentClass2 argumentObj2 = captor2.getValue();

//Assert argumentObj1 data here

4. Avoid Spy Objects from invocation during mocking:
doReturn("xyz").when(mockedClass).invokingSomeOtherMethod().
when(mockedClass).invokingSomeOtherMethod().thenReturn("xyz");

5. Mocking new instance creation:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToBeTested.class)
public class ClassToBeTested Test {

    private ClassToBeTested classToBeTested;

    @Before
    public void setUp() {
        classToBeTested = new ClassToBeTested();
    }

    @Test
    public void testSomeBehaviour() throws Exception {
        InternalClass internalClassObj = mock(InternalClass.class);//new InternalClass();
        PowerMockito.whenNew(InternalClass.class)
            .withAnyArguments().thenReturn(internalClassObj);

      classToBeTested.invokeBehaviourToBeTested();
 //verify the argument is internalClassObj

assert captor.getValue() equalsTo internalClassObj

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);