Дождаться, что интеграционное сообщение не пришло

Привет всем.
Столкнулись с такой проблемой, можете пожалуйста подсказать:

(1) создаём например в системе Клиента1, у которого параметры1 (тип = Физ Лицо, имя, номер телефона). В этой ситуации из системы улетает интеграционное сообщение. Соответственно, в автотесте мы проверяем что параметры клиента верные, а также дожидаемся интеграционное сообщение.

(2) теперь создаём в системе Клиента2, у которого параметры2 (тип = Юр Лицо). И при таких параметрах из системы не улетает никакое интеграционное сообщение. Это не ошибка, так и должно быть. В этом случае опять проверяем, что клиент действительно создался в системе с правильными параметрами. Но как можно проверить, что система не отправила интеграционное сообщение? Дожидаются ведь наличие чего-то. А как дождаться что что-то не пришло? Я с таким раньше не сталкивался. Подскажите кто-нибудь? Данный тест не требует браузера, поэтому Селениум тут не используется. В общем не ясно, как такого плана проверки делать.

не совсем ясно как вы создаете пользователя(видимо с помощью апи), и соответствующее приложение отсылает или не отсылает дополнительный запрос
Можете попробовать ловить сообщение если заранее известет url, или наоборот ожидать что ничего не пришло, могу посоветовать библиотеку wiremock если говорить о джава или postman/fiddler если говорить о мануальном отлове

1 лайк

Из того что я понял
Тест_1
Создай клиента -> дождись интеграционного сообщения
Токсть вы делаете чтото типа
"AssertNotNull(getIntegrationMessage(),"FAILED: 'Integration Message' IS null")"

Тест_2
Создай клиента -> проверь что сообщегия нет

Как вы проверяете что система отправила сообщение ?
Идете кудато в базу или через АПИ?
Попробуйтe взять “интеграционноe сообщение” для Теста_2 и провалидируйте чтото типа
"AssertNull(getIntegrationMessage(),"FAILED: 'Integration Message' is NOT null")"

2 лайка

Или можете использовать блок try {} catch.
если “элемент” не будет найден (интеграционное сообщение) - то мы попадаем в блок catch - в котором можем по своему обрабатывать ошибку, которая в вашем случае - не ошибка.

1 лайк

А каким образом проверяете интеграционное сообщение?
Я делал нечто подобное в API тестах, когда нужно было контролировать, что при ошибках не отправлялись запросы во внешнюю систему. Или наоборот отправлялись или отправлялись и потом делались сторнирующие операции. У нас это было на JMS (MQ-очереди) и стенд на котором проходило автотестирование был устроен таким образом, что за очередями не было реальной системы и вместо неё выступали мои заглушки, которые в коде теста перед тестом очищали очереди, в течении теста либо вычитывали сообщение и отправляли в ответ что-то или наоборот не отправляло (проверка таймаута) или наоборот пыталась подождать в течении 30-60 сек, что в очереди не появилось сообщения (как раз похоже на ваш случай). Минус у данного подхода очевидный - невозможность распараллеливания с другими тестами, т.к. если тест ждёт, что в очереди ничего не появилось, то в случае работы других тестов в параллели они начнут аффектить друг друга.

Я бы подобные задачи по хорошему проверял на стороне разработчиков в юнит-тестах. Есть возможность через Мокито указать, что не было вызова того или иного метода:

verify(mockedList, never()).add("never happened");