2011-08-31 8 views
7

メソッドをモックしてオブジェクトの新しいインスタンスを返すと、返されたインスタンスをどのように取得できますか?mockito:スタブされたメソッドの戻り値を取得する方法はありますか?

例えば:明らかに

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のようなもの?あなたは、その後Answerのインスタンスを観察し、notficationsに(新しいFooの作成をトリガーする)answerメソッドが呼び出されるたびに受け取りたいよう

答えて

6

が見えます。なぜObservableAnswerクラスを発明していない:

使用意図
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]) 
    } 

}); 
9

を私は似た何かをしたかったが、スパイのオブジェクトではなく、モックで。具体的には、スパイオブジェクトを指定すると、戻り値を取得する必要があります。 Andreas_Dの答えに基づいて、ここで私が思いついたのです。

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; 
    } 
} 

意図している用法:

// spy our dao 
final Dao spiedDao = spy(dao); 
// instantiate a service that does some stuff, including a database find 
final Service service = new Service(spiedDao); 

// let's capture the return values from spiedDao.find() 
final ResultCaptor<QueryResult> resultCaptor = new ResultCaptor<>(); 
doAnswer(resultCaptor).when(spiedDao).find(any(User.class), any(Query.class)); 

// execute once 
service.run(); 
assertThat(resultCaptor.getResult()).isEqualTo(/* something */); 

/// change conditions /// 

// execute again 
service.run(); 
assertThat(resultCaptor.getResult()).isEqualTo(/* something different */); 
関連する問題