Практическое использование опции для передачи "Поставщик" в качестве поставщика сообщений в 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.

Другие вопросы по тегам