AssertThrows не выдает исключение при прохождении через потоки Java - PullRequest
1 голос
/ 25 марта 2019

Итак, я пишу модульные тесты, в которых я тестирую возможности для внесения в черный и черный список пользователей (эта функция в моем коде работает сама по себе).

Вот пример команды, которая работает какОжидается:

assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));

Если я внесу пользователя в черный список «533», а затем выполню указанную выше команду, он будет работать нормально, потому что поднято ExecutionException (потому что вы пытаетесь найти пользователя, занесенного в черный список).Точно так же, если бы я НЕ находился в черном списке пользователя "533", но все еще выполнял вышеупомянутую команду, тест не прошел бы, что также ожидается по той же причине (то есть теперь не выдается исключение, поскольку вы НЕ извлекаете пользователя из черного списка).

Однако, если у меня есть List идентификаторов пользователей с именем userIds (частью которого теперь является "533"), и я заносу их в черный список (функционал, который, как я знаю, работает нормально), а затем запускаю командуниже:

userIds.stream().map(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));

... тест пройден, даже через него должно пройти FAILED.Зачем ?Поскольку все пользователи теперь занесены в черный список, поэтому при извлечении этих пользователей должен быть выдан ExecutionExceptions.

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

assertThrows(ExecutionException.class, () -> onlineStore.lookup("533"));

assertDoesNotThrow(() -> onlineStore.lookup("533"));

Таким образом, все это заставляет меня поверить, что по каким-то причинам при прохождении через потоки Java брошенные ExecutionExceptions не попадают в ловушку.

Есть какое-либо объяснение этому поведению?

1 Ответ

4 голосов
/ 25 марта 2019

Вы не вызываете никакую терминальную операцию в потоке, поэтому ваше утверждение никогда не выполняется.

Вы злоупотребляете map(), который должен создать новый поток путем преобразования каждого элемента.Что вы на самом деле хотите сделать, так это выполнить метод, который имеет побочный эффект для каждого элемента.Вот для чего forEach (и это также терминальная операция, которая фактически потребляет поток):

 userIds.stream().forEach(id -> assertDoesNotThrow(() -> onlineStore.lookup(id)));
...