集合上的 AssertJ 测试:哪个更好:'extracting' 或 Java8 forEach

AssertJ testing on a collection: what is better: 'extracting' or Java8 forEach

我是 AssertJ 的新手,我用它来对我编写的代码进行单元测试,并且正在考虑如何断言列表。

假设我们有一个消费者实体列表。每个实体都有自己的Phone、自己的服务提供商,后者有自己的名称和实体名称。

现在我们要断言存储库中的每个实体都获得了正确的数据,因此我们要测试列表中的每个项目是否相等 Phone。

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

现在我想测试一下Repository给的数据是否正确,

我可以用这个:

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

或者我可以使用 forEach (java 8):

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

1.faster/simple-r/readable是哪一个?我会选择 forEach,因为它的代码行更少,但可读性也更差。

2. 有没有其他方法可以像 foreach 但使用 asserThat 那样做 1liner?所以它将是可读的和简单的 - 并且不需要使用 EqualTo each

时间?类似于:

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

3.哪个更快?提取还是forEach?

谢谢!

我不确定 "faster" 是这里的主要问题。任何性能差异都可能是 immaterial;要么底层实现在非功能方面是等效的,要么 - 因为这里的上下文是单元测试 - consumerListFromRepository 非常小,从而限制了任何 material 性能差异的范围。

我想你主要关心的应该是

  • 让其他开发者尽可能容易地:
    • Understand/reason关于你的测试用例
    • Edit/refactor 你的测试用例
  • 确保您的断言方法与代码库中的其他测试用例一致

判断两种方法中哪一种最符合此框有些主观,但我认为以下考虑因素是相关的:

  • Java 8 forEach 构造很好理解,isEqualTo 匹配器明确且易于理解
  • AssertJ extracting 助手与 containsOnly 的配对不像 Java8 的 forEach 构造那样常见,但这种配对读起来合乎逻辑且易于理解

所以,恕我直言,这两种方法都是有效的。如果您的代码库始终使用 AssertJ,那么我建议将 extracting 助手与 containsOnly 匹配器配对使用以保持一致性。否则,请使用最适合您的方式:)