Как использовать jUnit 5 Assertions, чтобы проверить, начинается ли сообщение об исключении со строки? - PullRequest
1 голос
/ 07 октября 2019

Я использую org.junit.jupiter.api.Assertions объект, чтобы утверждать, что выброшено исключение:

Assertions.assertThrows(
        InvalidParameterException.class,
        () -> new ThrowingExceptionClass().doSomethingDangerous());

Упрощенно, выброшенное исключение имеет переменную часть dateTime в своем сообщении:

final String message = String.format("Either request is too old [dateTime=%s]", date);
new InvalidParameterException(message);

Начиная с версии, я использую 5.4.0 Assertions, обеспечивающий три метода проверки исключения:

Ни один из них не предоставляет механизм, проверяющий, начинается ли строка с еще одна строка. Последние 2 метода только проверяют, равна ли строка. Как мне легко проверить, начинается ли сообщение об исключении с "Either request is too old", так как в пределах одного и того же InvalidParameterException может быть больше вариантов сообщения? 1036 *


Я бы оценил метод assertThrows​(Class<T> expectedType, Executable executable, Predicate<String> messagePredicate), в котором предикат предоставил быбросается message и утверждение проходит, когда предикат возвращает true, например:

Assertions.assertThrows(
    InvalidParameterException.class,
    () -> new ThrowingExceptionClass().doSomethingDangerous()
    message -> message.startsWith("Either request is too old"));

К сожалению, его не существует. Любое решение?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вам следует проверять содержимое текста сообщения об исключении, только если это сообщение является определенной частью API тестируемого модуля. Но сомнительно, следует ли вам это делать.

Текст сообщения об исключениях обычно не должен представляться пользователям как часть пользовательского интерфейса вашего приложения.

Указание содержимого текста сообщения побуждает клиентов API анализировать этот текст сообщения, чтобы узнать конкретную информацию об исключительном состоянии. Это сложно, подвержено ошибкам и не нужно. В вашем случае у клиентов может возникнуть желание проанализировать текст сообщения для извлечения значения date.

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

1 голос
/ 07 октября 2019

assertThrows возвращает ваш экземпляр исключения ожидаемого типа (если есть). Затем вы можете вручную получить сообщение от is и проверить, начинается ли оно с нужной вам строки.

Вот образец из doc

@Test
void exceptionTesting() {
    Exception exception = assertThrows(ArithmeticException.class, () ->
        calculator.divide(1, 0));
    assertEquals("/ by zero", exception.getMessage());
}
...