How to validate the return value when calling a mocked object's method

10,357

You could use the Answer interface to capture a real response.

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:

class HatesTwos {
    boolean hates(int val) {
        return val == 2;
    }
}

HatesTwos hater = spy(new HatesTwos());

// let's capture the return values from hater.hates(int)
ResultCaptor<Boolean> hateResultCaptor = new ResultCaptor<>();
doAnswer(hateResultCaptor).when(hater).hates(anyInt());

hater.hates(1);
verify(hater, times(1)).hates(1);
assertFalse(hateResultCaptor.getResult());

reset(hater);

hater.hates(2);
verify(hater, times(1)).hates(2);
assertTrue(hateResultCaptor.getResult());
Share:
10,357
Chris Morris
Author by

Chris Morris

Software Engineer at Google.

Updated on June 16, 2022

Comments

  • Chris Morris
    Chris Morris about 2 years

    Using Mockito, is there a way to spy() on an object and verify that an object is called a given # of times with the specified arugments AND that it returns an expected value for these calls?

    I'd like to do something like the following:

    class HatesTwos {
      boolean hates(int val) {
        return val == 2;
      }
    }
    
    HatesTwos hater = spy(new HatesTwos());
    hater.hates(1);
    assertFalse(verify(hater, times(1)).hates(1));
    
    reset(hater);
    hater.hates(2);
    assertTrue(verify(hater, times(1)).hates(2));