Mockito + Spy: How to gather return values

The standard mocking approach would be to:

  1. Pre-create the object you want the factory to return in the test case
  2. Create a mock (or spy) of the factory
  3. Prescribe the mock factory to return your pre-created object.

If you really want to have the RealFactory create the object on the fly, you can subclass it and override the factory method to call super.create(...), then save the reference to a field accessible by the test class, and then return the created object.


First thing, you should be passing spy in as the constructor argument.

That aside, here's how you could do it.

public class ResultCaptor<T> implements Answer {
    private T result = null;
    public T getResult() {
        return result;
    }

    @Override
    public T answer(InvocationOnMock invocationOnMock) throws Throwable {
        result = (T) invocationOnMock.callRealMethod();
        return result;
    }
}

Intended usage:

RealFactory factory     = new RealFactory();
RealFactory spy         = spy(factory);
TestedClass testedClass = new TestedClass(spy);

// At this point I would like to get a reference to the object created
// and returned by the factory.


// let's capture the return values from spy.create()
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>();
doAnswer(resultCaptor).when(spy).create();

// do something that will trigger a call to the factory
testedClass.doSomething();

// validate the return object
assertThat(resultCaptor.getResult())
        .isNotNull()
        .isInstanceOf(RealThing.class);

Tags:

Java

Mockito

Spy