Questa potrebbe sembrare una domanda abbastanza dettagliata su Easymock, ma sto incontrando difficoltà nel trovare un sito di supporto/forum/mailing list per questa libreria.Easymock: l'ordine delle catture è importante?
Sto riscontrando un errore durante l'utilizzo del metodo captures()
che sembra restituire i parametri catturati in ordine.
Ecco una versione semplificata di quello che sto testando:
public class CaptureTest extends TestCase {
// interface we will be mocking
interface Processor {
void process(String x);
}
// class that uses the interface above which will receive the mock
class Component {
private Processor processor;
private String[] s = { "one", "two", "three", "four" };
Component(Processor processor) {
this.processor = processor;
}
public void doSomething() {
for (int i = 0; i < s.length; i++) {
processor.process(s[i]);
}
}
}
public void testCapture() {
//create the mock, wire it up
Processor mockProcessor = createMock(Processor.class);
Component component = new Component(mockProcessor);
//we're going to call the process method four times
//with different arguments, and we want to capture
//the value passed to the mock so we can assert against it later
Capture<String> cap1 = new Capture<String>();
Capture<String> cap2 = new Capture<String>();
Capture<String> cap3 = new Capture<String>();
Capture<String> cap4 = new Capture<String>();
mockProcessor.process(and(isA(String.class), capture(cap1)));
mockProcessor.process(and(isA(String.class), capture(cap2)));
mockProcessor.process(and(isA(String.class), capture(cap3)));
mockProcessor.process(and(isA(String.class), capture(cap4)));
replay(mockProcessor);
component.doSomething();
//check what values were passed to the mock
assertEquals("one", cap1.getValue());
assertEquals("two", cap2.getValue());
assertEquals("three", cap3.getValue());
assertEquals("four", cap4.getValue());
verify(mockProcessor);
}
}
(Si prega di notare che questo è solo un banco di prova semplificata - So che avrei potuto specificare il valore esatto degli argomenti mi aspetto che passò alla mia mock, ma nel mio caso reale gli argomenti sono oggetti complessi con una manciata di campi, e voglio catturare l'oggetto in modo tale da poter affermare solo alcuni di quei campi senza ricreare l'intero oggetto nel mio caso di test).
Quando eseguo il test, non riesce a:
junit.framework.ComparisonFailure: atteso: < [uno]> ma era: < [quattro]>
che significa che il il parametro che EasyMock sta acquisendo in cap1
non è la prima chiamata al metodo, ma l'ultima (poiché il valore è four
). Ottengo gli stessi risultati se inverto le dichiarazioni captures()
, cioè utilizzo cap4
con la prima chiamata al metodo, ecc.
Sembra che potrebbe trattarsi di un bug in EasyMock - diversi parametri passati allo stesso metodo in diverse chiamate t sembra essere catturato correttamente.
C'è qualcun altro che utilizza capture()
con EasyMock e ha problemi simili? C'è una soluzione facile a tua conoscenza o un modo diverso per catturare i parametri passati ai metodi del mio mock?
Update 1: esempio di codice fisso per mostrare che sto usando createMock
, non createStrictMock
, ma ottengo lo stesso errore con entrambi (anche se il valore reale di ciò che viene catturato modifiche).
Ho osservato questo problema ed è abbastanza confuso. Se esegui un'istruzione System.out.println su ciascuna delle Capture, vedrai quanto segue con un createMock: four, four, four, four. Con un createStrickMock: due, due, tre, quattro. – hooknc
Quindi sembra proprio un bug! Ho inviato un bug sulla pagina sourceforge di Easymock, speriamo che qualcuno risponda - anche se dalla mancanza di mailing list, forum/commenti sulla home page, ecc., Ho una sensazione che il supporto è estremamente limitato :( –