Di seguito è riportata una configurazione semplificata della mia applicazione. Ha un Foobar di classe che chiama un metodo di facciata per il recupero dei dati. La facciata quindi richiede un servizio Web per ottenere effettivamente i dati e quindi manipola leggermente i dati per poi restituirli a Foobar.Test di una chiamata al metodo asincrono
Ora, poiché il servizio Web potrebbe richiedere un po 'di tempo per essere eseguito, la chiamata del metodo alla facciata deve essere asincrona. Quindi il metodo della facciata non ha un valore di ritorno, ma, invece, il metodo usa un oggetto di callback. Guarda l'esempio e continua a leggere qui sotto.
public class Foobar {
private List<DTO> dtos;
@Autowired
private Facade facade;
public void refresh() {
facade.refreshFoobar(new CallBack() {
public void dataFetched(List<DTO> dtos) {
setDtos(dtos);
}
});
}
public void setDtos(List<DTO> dtos) {
this.dtos = dtos;
}
}
public class Facade {
...
public void refreshFoorbar(CallBack cb) {
// Fetch data from a web service
List<DTO> dtos = webService.getData();
// Manipulate DTOs
....
// call on the callback method
cb.dataFecthed(dtos);
}
}
Ho due modi di rendere metodo asincrono della facciata, sia creando un filo manualmente oppure utilizzando molle @Async annotazione.
public class Facade {
public void refreshFoorbar(CallBack cb) {
new Thread() {
@Override
public void run() {
....
}
}.start();
}
}
// ... OR ...
public class Facade {
@Async
public void refreshFoorbar(CallBack cb) {
....
}
}
Il mio problema è che ora ho bisogno di scrivere un test di integrazione per questa catena di chiamate di metodo. Penso che sia necessario forzare la chiamata alla facciata asincrona per essere sincrona quando viene eseguito il test di integrazione, altrimenti non saprò per certo quando posso fare le asserzioni appropriate. L'unica idea per fare in modo che la chiamata al metodo sia sincrona consiste nell'utilizzare i thread gestiti manualmente e nel rendere il threading condizionale (quindi, a scopo di test, ho una clausola if che determina se il metodo della facciata deve essere eseguito in un thread separato o meno).
Tuttavia, ho la sensazione che potrebbe esserci una soluzione migliore al mio problema, sia che si tratti di un metodo migliore per forzare il metodo per me sincrono, ad esempio con spring, o testando il multithreading in qualche modo.
Qui è dove ho bisogno dei tuoi suggerimenti, come risolveresti il mio problema? Nota, sto usando junit per i test di unità e di integrazione.
Non so se è il modo corretto. In genere, il test per condizioni asincrone sta avviando l'attività asincrona, attende un po 'e verifica se l'attività è stata completata. – SJuan76