Тестирование AssertJ на коллекции: что лучше: извлечение или Java8 forEach

Я новичок в AssertJ, использую его для модульного тестирования написанного кода и думал, как утверждать список.

Предположим, у нас есть список объектов-потребителей. у каждой сущности есть собственный телефон, собственный поставщик услуг, у которого есть собственное имя и имя сущности.

Теперь мы хотим утверждать, что каждая сущность из репозитория получает правильные данные, поэтому мы хотим проверить, что каждый элемент в списке имеет одинаковый телефон.

ConsumerEntity savedConsumer1 = Consumer(phone, name, serviceProvider)
List<ConsumerEntity> consumerListFromRepository = repository.findAllByPhone(phone)

Теперь я хочу проверить правильность данных, предоставленных из репозитория,

Я могу использовать это:

   assertThat(consumerListFromRepository)
            .extracting(ConsumerEntity::getPhone())
            .containsOnly(savedConsumer1.getPhone());

Или я могу сделать это с помощью forEach (java 8):

   consumerListFromRepository.forEach(consumerEntity ->
   assertThat(consumerEntity.getPhone()).isEqualTo(savedConsumer1.getPhone()));

1. Какой из них быстрее / проще / читабельнее? Я выберу forEach для меньшего количества строк кода, но также для меньшей читабельности.

2. Есть ли другой способ сделать это 1liner, как foreach, но с asserThat? так что он будет удобочитаемым и простым - и без необходимости использовать EqualTo каждый

время? что-то типа:

   asserThat(list).forEach........

3. Какой из них быстрее? Извлечение или для каждого?

Спасибо!


person a.k    schedule 06.12.2017    source источник


Ответы (1)


Я не уверен, что здесь главное - «быстрее». Вполне вероятно, что любая разница в производительности несущественна; либо базовые реализации ~ эквивалентны с точки зрения нефункционалов, либо - поскольку здесь контекст является модульным тестом - consumerListFromRepository тривиально мал, что ограничивает возможности любых существенных различий в производительности.

Я думаю, что вас больше всего беспокоит

  • Making it as easy as possible for other developers to:
    • Understand/reason about your test case
    • Отредактируйте / реорганизуйте свой тестовый пример
  • Обеспечение согласованности вашего подхода к утверждению с другими тестовыми примерами в вашей базе кода.

Решение о том, какой из ваших двух подходов лучше всего подходит для этого флажка, является несколько субъективным, но я думаю, что следующие соображения важны:

  • Конструкция forEach в Java 8 хорошо изучена, а сопоставитель isEqualTo явным и понятным.
  • Помощник AssertJ extracting в паре с containsOnly встречается реже, чем конструкция forEach в Java8, но эта пара читается логически и легко понимается.

Итак, IMHO оба подхода действительны. Если ваша база кода постоянно использует AssertJ, я бы предложил использовать помощник extracting в паре с сопоставителем containsOnly для согласованности. В противном случае используйте то, что вам больше нравится :)

person glytching    schedule 06.12.2017
comment
Спасибо за четкий ответ! Вы правы - скорость тут ни к чему, это тест. - person a.k; 06.12.2017
comment
Я согласен с @glytching, я просто хочу добавить, что опция foreach не выдает такое же сообщение об ошибке, как при извлечении + containsOnly, которое показывало бы всю коллекцию извлеченных значений. вы также можете попробовать allSatisfy. - person Joel Costigliola; 07.12.2017
comment
@JoelCostigliola хороший вызов ... соображение удобочитаемости также включает вывод ошибочного утверждения. - person glytching; 07.12.2017
comment
Спасибо, Джоэл. проверим это - person a.k; 07.12.2017