Как утверждать, был ли вызван лямбда-код

#java #lambda #mockito #junit5 #assertj

#java #лямбда #mockito #junit5 #assertj

Вопрос:

В настоящее время я работаю с lambda (потребитель или Функция) в качестве параметра моих методов.

И мне интересно, каков наилучший способ подтвердить, было ли выполнено лямбда-выражение.

Я нашел 2 решения, и мне интересно, какое из них лучше или существует что-то еще.

  1. Используйте список и добавляйте объект каждый раз, когда вызывается потребитель
    List<Object> listCall = new ArrayList<>()
   myObject.myMethod((param)->listCall.add(param))
   asserThat(listCall).hasSize(wantedNumberCall)

  

Pro: это работает. Вы можете посчитать количество звонков

Минусы: немного неудобно добавлять этот пользовательский лямбда-код только для тестирования чего-то подобного

  1. Используйте Mockito, чтобы высмеять вашего Потребителя / функцию
    myObject.myMethod(consumerMock)
   Mockito.verify(consumerMock,Mockito.times(0)).apply(any());

  

Pro: У Mockito есть много возможностей для подсчета вызовов с аргументом.

Минусы: Mockito не рекомендует издеваться над объектами, которые вам не принадлежат. И иногда нужно издеваться над чем-то большим, чем просто применить (потребитель) или принять (потребитель)

Комментарии:

1. Какой тестовый фреймворк вы используете?

2. Junit 5 с assertj и mockito

3. Просто чтобы у меня было это право, myMethod принимает лямбда-выражение, и вы хотите проверить, выполнено ли это лямбда-выражение?

4. Я бы просто сказал, чтобы проверить эффект лямбды, в приведенном вами примере, размер listCall . Вам нужно только протестировать что-то вроде того, выполняется ли лямбда-код, если он является частью API / библиотеки.

5. Mockito кажется естественным выбором для проверки взаимодействий.

Ответ №1:

Может быть, это немного излишне, но ничего не приходит на ум, кроме использования StackWalker для полного отделения assert от lambda. Просто подтвердите, что ваш consumerMock находится там, где он должен быть в стеке

https://docs.oracle.com/javase/9/docs/api/java/lang/StackWalker.html

Комментарии:

1. Да, я думаю, что это немного излишне. Тесты должны быть как можно более простыми. Но, 1, о чем я не знал StackWalker раньше.