2011-08-31 18 views
7

Bazı nesnelerin yeni bir örneğini döndürmek için bir yöntemle uğraşırsam, döndürülen örneği nasıl yakalayabilirim?mockito: Stubbed yönteminin dönüş değerini yakalamanın bir yolu var mı?

Örn .: Açıkçası

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

, ben tip Foo tarlası sahip olabilir ve answer içinde yeni bir örneğini ayarlayın, ancak daha güzel bir yolu var mı? ArgumentCaptor gibi bir şey? Eğer için sonra Answer örneklerini gözlemlemek ve Bildirimleri (yeni Foo oluşturulmasını tetikler) answer yöntem her çağrıldığında almak ister gibi

cevap

6

görünüyor.

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

Kullanım Amacı:: Öyleyse neden bir ObservableAnswer sınıf icat

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

Benzer bir şey yapmak istedim, ama bir Fark edilmiş nesne yerine bir mock ile. Spesifik olarak, bir spied nesnesi verildiğinde, dönüş değerini yakalamak istiyorum. Andreas_D 'un cevabına dayanarak, işte buraya geldim.

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

Amaçlanan kullanım:

// 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 */); 
İlgili konular