Практическое использование опции для передачи "Поставщик" в качестве поставщика сообщений в JUnit 5
Assertions
класс в JUnit 5 позволяет передавать Supplier<String>
как messageSupplier
объект, который предоставляет текст сообщения, чтобы сообщить, когда тест не пройден.
Например, assertEquals
:
public static void assertEquals( char expected,
char actual,
Supplier<String> messageSupplier )
Мне интересно, каково практическое использование такого поставщика, особенно в контексте модульного тестирования.
Я могу представить, возможно, локализацию строк, хотя это кажется немного странным для локализации, когда аудитория является участником проекта разработки.
➥ Существуют ли другие практические способы передачи такого поставщика сообщений, а не жестко закодированная строка сообщения?
1 ответ
При создании сообщения дорого
Если я правильно помню, мы - команда JUnit 5 - представили вариант поставщика для случаев, когда создание строки сообщения является дорогостоящим, например, из-за доступа к базе данных. Вы бы хотели сделать это только в случае необходимости, то есть в случае неудачи.
Когда сообщение можно построить только в случае неудачи
Помимо того, что создание сообщения является дорогостоящим, как уже было сказано, я думаю, что еще один интересный и полезный вариант использования - это когда сообщение об ошибке может быть создано только в случае сбоя.
Например, предположим, что у вас есть объект в результате одного из ваших методов, и вы ожидаете, что этот объект будет
null
. В случае сбоя вы хотите показать сообщение об ошибке с некоторой информацией, взятой из неожиданного ненулевого объекта, например, путем вызова одного из его методов:
MyEntity e = mySut.find(...);
assertNull(e, "Unexpected found entity with id: " + e.getId());
Этот метод тестирования всегда будет вызывать
NullPointerException
когда тест должен быть успешным. Фактически, строка сообщения всегда оценивается как аргумент метода assert. Вместо того, чтобы прибегать к более сложным и запутанным решениям, подрывающим читабельность ваших тестов, например
MyEntity e = mySut.find(...);
String failureMessage = "";
if (e != null)
failureMessage = "Unexpected found entity with id: " + e.getId();
assertNull(e, failureMessage);
Вы можете просто использовать метод assert с поставщиком сообщений:
MyEntity e = mySut.find(...);
assertNull(e, () -> "Unexpected found entity with id: " + e.getId());
Теперь тело лямбды будет выполняться только в случае сбоя, когда объект, использованный для создания сообщения, наверняка не
null
.