Ниже приведена упрощенная настройка моего приложения. У него есть класс Foobar, который вызывает метод фасада для извлечения данных. Затем фасад вызывает веб-сервис для фактического получения данных, затем немного манипулирует данными и возвращает их в Foobar.
Теперь, поскольку запуск веб-службы может занять много времени, вызов метода для фасада должен быть асинхронным. Следовательно, метод фасада не имеет возвращаемого значения, но вместо этого метод использует объект обратного вызова. Посмотрите на пример и продолжайте читать ниже.
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);
}
}
У меня есть два способа сделать метод фасада асинхронным: создать поток вручную или с помощью аннотации springs @Async.
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) {
....
}
}
Моя проблема в том, что теперь мне нужно написать интеграционный тест для этой цепочки вызовов методов. Я думаю, что нужно заставить синхронный вызов асинхронного фасада быть синхронным при запуске интеграционного теста, иначе я не буду точно знать, когда смогу сделать соответствующие утверждения. Единственная идея сделать синхронный вызов метода состоит в том, чтобы использовать потоки, обработанные вручную, и сделать поток условным (так, для целей тестирования у меня есть предложение if, которое определяет, следует ли запускать метод фасада в отдельном потоке или нет).
Тем не менее, у меня есть ощущение, что могло бы быть лучшее решение моей проблемы, будь то лучший способ заставить меня работать синхронно, например, с помощью пружины, или проверить многопоточность каким-либо образом.
Это где мне нужны ваши предложения, как бы вы решили мою проблему? Обратите внимание, я использую junit для модульных и интеграционных тестов.