ExecutorService+GreenMail

153
31 августа 2018, 10:30

Тестирую отправку сообщений с помощью 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() - показывает пустой лист(

Answer 1

так как вы запускаете тестовые запросы асинхронно, то основной поток, запустивший сервер завершается не дожидаясь асинхронных задач. Ожидание запущенных задач можно реализовать разными способами:

  • например CountDownLatch
  • или если время выполнения теста не важно, но нет времени разбираться с CountDownLatch, можно в цикле вызывать Thread.sleep и проверять завершение задач вызывая CompletableFuture.isDone()

другие предполагаемые (т.к. полного кода теста нет) проблемы:

  • JavaMailSenderImpl использует нестандартный SMTP порт (3025), который не конфигурится в serverSetup
Answer 2

Как выше писал Ramiz надо действительно заставить фейк-сервер ждать прихода сообщений. Использовала библиотеку awailitility, интегрированную с Groovy.

READ ALSO
Непонятный код, цикл и поля

Непонятный код, цикл и поля

Цикл: for (j = 2; j < i; j++), в чем заключается j<iКак это понять? Откуда мы придумали j?

194
Как отследить изменение в объекте?

Как отследить изменение в объекте?

Как в javascript можно отследить изменение свойства объекта и при изменении вызвать callBack? Например: objprop = true; При изменении obj

173
React приложение. Cross origin запрос

React приложение. Cross origin запрос

Решил попробовать Реакт

160