Mockito:有没有一种方法可以捕获存根方法的返回值? [英] mockito: Is there a way of capturing the return value of stubbed method?

查看:44
本文介绍了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])
     }

 });

这篇关于Mockito:有没有一种方法可以捕获存根方法的返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆