Mockito:有没有一种方法可以捕获存根方法的返回值?

Mockito:有没有一种方法可以捕获存根方法的返回值?

问题描述:

如果我模拟一种方法来返回某个对象的新实例,那么如何捕获返回的实例?

If I mock a method to return a new instance of some object, how can I capture the returned instance?

例如:

 when(mock.someMethod(anyString())).thenAnswer(new Answer() {
     Object answer(InvocationOnMock invocation) {
         Object[] args = invocation.getArguments();
         Object mock = invocation.getMock();
         return new Foo(args[0])
     }
 });

很明显,我可以有一个Foo类型的字段,并且在answer内部将其设置为新实例,但是有更好的方法吗?像ArgumentCaptor一样?

Obviously, I can have a field of type Foo and inside answer set it to the new instance, but is there a nicer way? Something like ArgumentCaptor?

看起来像您想先先观察然后再Answer个实例,并在每次调用answer方法时收到通知(这会触发创建新的Foo).那么为什么不发明一个ObservableAnswer类:

Looks like you want to observe then Answer instances and receive notfications each time the answer method is called (which triggers the creation of a new Foo). So why not invent an ObservableAnswer class:

public abstract class ObservableAnswer implements Answer {
  private Listener[] listeners; // to keep it very simple...

  public ObservableAnswer(Listener...listeners) {
    this.listeners = listeners;
  }

  @Override
  public Object answer(InvocationOnMock invocation) {
    Object answer = observedAnswer(invocation);
    for (Listener listener:listeners) {
       listener.send(answer);
    }
    return answer;
  }

  // we'll have to implement this method now
  public abstract Object observedAnswer(InvocationOnMock invocation);
}

预期用途:

Listener[] myListenerns = getListeners();  // some magic (as usual)
when(mock.someMethod(anyString())).thenAnswer(new ObservableAnswer(myListeners) {
     Object observedAnswer(InvocationOnMock invocation) {
         Object[] args = invocation.getArguments();
         Object mock = invocation.getMock();
         return new Foo(args[0])
     }

 });