Предположим, у меня есть метод для тестирования, который
- могут иметь побочные эффекты (например, файлы, созданные в файловой системе), и
- может вызвать исключение.
Некоторые побочные эффекты можно наблюдать (и тестировать) даже при выдаче исключения. Мой пример тестового кода приведен ниже:
final SoftAssertions softly = new SoftAssertions();
try {
/*
* May throw an exception
*/
doSmth();
} catch (final IOException ioe) {
/*
* How do I add a soft assertion wrapping an exception?
*/
}
/*
* Testing for side effects.
*/
softly.assertThat(...).as("%s exit code", ...).isEqualTo(0);
softly.assertThat(...).as("the number of downloaded files").isEqualTo(3);
softly.assertThat(...).as("this should be true").isTrue();
softly.assertThat(...).as("and this should be true, too").isTrue();
softly.assertAll();
Вопрос 1
Каков наилучший способ создать еще одно мягкое утверждение из выброшенного исключения? С необработанным API TestNG я мог просто написать
softly.fail(ioe.toString(), ioe);
но AssertJ похоже не дает ничего подобного. Пока что мой лучший вариант — добавить что-то вроде этого в блок catch:
softly.assertThat(true).as(ioe.toString()).isFalse();
Есть ли лучшие альтернативы?
вопрос 2
Как сделать так, чтобы исключения, выдаваемые моим тестируемым кодом, отображались как причина (или подавленные исключения) результирующего AssertionError
? В настоящее время я делаю следующее:
Throwable failure = null;
try {
doSmth();
} catch (final IOException ioe) {
failure = ioe;
}
try {
softly.assertAll();
} catch (final AssertionError ae) {
if (failure != null) {
if (ae.getCause() == null) {
ae.initCause(failure);
} else {
ae.addSuppressed(failure);
}
}
throw ae;
}
- но более элегантная версия высоко ценится.