Тестирование сообщения об ожидаемом исключении с помощью junit 5 - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть проект, в котором у меня есть тесты, в которых я намеренно вызываю проблему, а затем проверяю, отвечает ли код так, как я хочу. Для этого я хочу убедиться, что исключения не только являются правильным классом, но и должны содержать правильное сообщение.

Так что в одном из моих существующих (junit 4) тестов у меня есть кое-чтопримерно так:

public class MyTests {
  @Rule
  public final ExpectedException expectedEx = ExpectedException.none();

  @Test
  public void testLoadingResourcesTheBadWay(){
    expectedEx.expect(MyCustomException.class);
    expectedEx.expectMessage(allOf(startsWith("Unable to load "), endsWith(" resources.")));
    doStuffThatShouldFail();
  }
}

В настоящее время я изучаю полную миграцию на junit 5, который больше не поддерживает @ Rule и теперь имеет assertThrows, который, кажется, заменяет это.

То, что я не смог выяснить, как написать тест, который проверяет не только выбрасываемое исключение (класс), но и сообщение, прикрепленное к этому исключению.

Как правильно написать такой тест в Junit 5?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Поскольку Assertions.assertThrows возвращает экземпляр вашего исключения, вы можете вызвать getMessage в возвращенном экземпляре и сделать утверждения в этом сообщении:

Executable executable = () -> sut.method(); //prepare Executable with invocation of the method on your system under test

Exception exception = Assertions.assertThrows(MyCustomException.class, executable); // you can even assign it to MyCustomException type variable
assertEquals(exception.getMessage(), "exception message"); //make assertions here
3 голосов
/ 30 сентября 2019

Благодаря @michalk и одному из моих коллег это работает:

Exception expectedEx = assertThrows(MyCustomException.class, () ->
    doStuffThatShouldFail()
);
assertTrue(expectedEx.getMessage().startsWith("Unable to load "));
assertTrue(expectedEx.getMessage().endsWith(" resources."));
...