Sto utilizzando GWTP, aggiungendo un livello Contract per astrarre le conoscenze tra Presenter e View e sono abbastanza soddisfatto del risultato con GWTP. Sto testando i miei presentatori con Mockito.Test del presentatore GWTP con chiamate asincrone
Ma col passare del tempo, ho trovato che era difficile mantenere un presentatore pulito con i suoi test. Ci sono alcune cose di refactoring che ho fatto per migliorarlo, ma non ero ancora soddisfatto.
Ho trovato il seguente argomento: I miei relatori hanno spesso bisogno di una chiamata asincrona, o in genere chiamata a un metodo di oggetti con un callback per continuare il flusso del relatore (di solito sono nidificati).
Ad esempio:
this.populationManager.populate(new PopulationCallback()
{
public void onPopulate()
{
doSomeStufWithTheView(populationManager.get());
}
});
Nel mio test, ho finito per verificare la chiamata della popolazione() dell'oggetto PopulationManager deriso. Quindi creare un altro test sul metodo doSomeStufWithTheView().
Ma ho scoperto piuttosto rapidamente che si trattava di un cattivo design: qualsiasi modifica o refactoring ha finito per interrompere molti dei miei test e mi ha costretto a creare da subito altri, anche se la funzionalità del presentatore non è cambiata! Plus Non ho verificato se il callback fosse effettivamente quello che volevo.
così ho cercato di utilizzare Mockito metodo doAnswer a non rompere il mio presentatore flusso di test:
doAnswer(new Answer(){
public Object answer(InvocationOnMock invocation) throws Throwable
{
Object[] args = invocation.getArguments();
((PopulationCallback)args[0]).onPopulate();
return null;
}
}).when(this.populationManager).populate(any(PopulationCallback.class));
ho scomposto il codice per essere meno prolissa (ed internamente meno dipendente alla posizione arg):
doAnswer(new PopulationCallbackAnswer())
.when(this.populationManager).populate(any(PopulationCallback.class));
Così, mentre il beffardo populationManager, ho potuto ancora testare il flusso del mio presentatore, in fondo così:
@Test
public void testSomeStuffAppends()
{
// Given
doAnswer(new PopulationCallbackAnswer())
.when(this.populationManager).populate(any(PopulationCallback.class));
// When
this.myPresenter.onReset();
// Then
verify(populationManager).populate(any(PopulationCallback.class)); // That was before
verify(this.myView).displaySomething(); // Now I can do that.
}
Mi chiedo se sia un buon uso del metodo doAnswer, o se si tratta di un odore di codice e può essere utilizzato un design migliore?
In genere, i miei relatori tendono a utilizzare solo altri oggetti (come alcuni modelli di mediatore) e interagiscono con la vista. Ho qualche presentatore con diverse centinaia (~ 400) righe di codice.
Anche in questo caso, è una prova di progettazione errata o è normale che un presentatore sia prolisso (perché utilizza altri oggetti)?
Qualcuno ha sentito parlare di qualche progetto che utilizza GWTP e verifica il suo presentatore in modo pulito?
Spero di averlo spiegato in modo completo.
Grazie in anticipo.
PS: Sono abbastanza nuovo per Stack Overflow, più il mio inglese è ancora carente, se la mia domanda ha bisogno di qualcosa da migliorare, per favore dimmi.
questo è semplicemente perfetto !!! +1 – EMM