Mockito Spy Test

java, mockito, spring

Solution

I was intrigued by this post and the comments left by @David so I decided to code a working example for those who follow like me

/*
 * class to test
 */
public class A {

    public void methodA(String str) {
        this.methodB(str);
    }

    protected void methodB(String str) {
        // some implementation
    }
}

We want to assert that the value being passed into methodB() is what we expect. Reading up on the ArgumentCaptor led me to discover the equivalent Captor Annotation

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MultipleMethodCallTest {

    @Spy
    A a = new A();

    @Captor ArgumentCaptor<String> captor;

    @Test
    public void captureSecondMethodCallArgument() throws Exception {

        // EXPECTED

        String greeting = "hello world";

        // PERFORM TEST

        a.methodA(greeting);

        // ASSERT

        verify(a).methodB(captor.capture());

        assertEquals(greeting, captor.getValue());
    }
}

This example was tested with

- mockito-all-1.8.5.jar

- junit-4.8.2.jar

Problem

I am using Mockito to write tests for code. However I am stuck at following scenario - Class A has 2 methods, method1() and method2(). I tried using ArgumentCaptor to catch values sent to method2(). But, since I am using @Spy, I cannot use Matchers. How do I test method1()? ``` class A{ B b; method1(arg1, arg2){ //some logic method2(arg1, arg2, ....argN); } method2(arg1, arg2,....argN){ //some logic b.method3(arg1, arg2...); } } ``` How to verify method2 receives same argument values? Following is the test class I wrote: ``` Class TestA{ @Mock B b; @Spy @InjectMocks //required else b is null A a = new A(); @Test public void testMethod1(){ a.method1(arg1, arg2); //How to verify method2 receives same argument values (arg1, arg2)???? //verify(a, times(1)).method2(.......); } ``` }

Original source