Тестирую отправку сообщений с помощью JavaMailSender, который запускается из ExecutorService с помощью submit, все работает отлично, но в тестах GreenMail не получает сообщения, так как заканчивает работу слишком быстро. До этого использовала execute+awaitTermination - все проходило на ура. setServerStartUpTimeout, setServerConnectionTimeout на любое время для GreenMail не помогают. Как можно это решить? или есть другие библиотеки чтобы имитировать SMTP server?
Вот код, то что в отправителе
notifications.forEach(notification -> {
Supplier<Boolean> sendingTask = () -> sendNotification(notification);
CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(sendingTask, executorService);
future.whenComplete((result, ex) -> {
if (result) {
log.info("Successfull");
}
if (ex != null) {
log.error("Error by sending", ex);
}
});
});
Это в тесте
def setup() {
ServerSetup serverSetup = ServerSetupTest.SMTP
serverSetup.setServerStartupTimeout(50000)
serverSetup.setWriteTimeout(50000)
serverSetup.setReadTimeout(50000)
serverSetup.setConnectionTimeout(50000)
testSmtp = new GreenMail(serverSetup)
testSmtp.start()
javaMailSender = new JavaMailSenderImpl()
javaMailSender.setHost("127.0.0.1")
javaMailSender.setPort(3025)
}
и в самом тестовом методе
def messages = testSmtp.getReceivedMessages() - показывает пустой лист(
так как вы запускаете тестовые запросы асинхронно, то основной поток, запустивший сервер завершается не дожидаясь асинхронных задач. Ожидание запущенных задач можно реализовать разными способами:
CountDownLatchThread.sleep и проверять завершение задач вызывая CompletableFuture.isDone() другие предполагаемые (т.к. полного кода теста нет) проблемы:
Как выше писал Ramiz надо действительно заставить фейк-сервер ждать прихода сообщений. Использовала библиотеку awailitility, интегрированную с Groovy.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости