2011-08-31 4 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

보인다.

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

사용 목적 : 그래서 왜 ObservableAnswer 클래스 발명하지

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 */); 
관련 문제