【问题标题】:Integration Test Asserting Each Element In A Collection集成测试断言集合中的每个元素
【发布时间】:2018-10-19 18:37:35
【问题描述】:

考虑使用 Spring-Boot 和 JUnit 来测试从数据库返回的集合是否包含所有需要的元素的 IT。最好的方法是什么?

为了说明,考虑一个 JPA 类/实体,如下所示:

class Person {

    Integer id;
    String name;
    String lastName;
    Address address;
    Account account;

}

考虑到PersonAddressAccount 的ID 将是自动生成的,所以我无法推断它们。

任何帮助将不胜感激。

【问题讨论】:

  • 你的意思是问你如何创建 2 个或更多 Person 实例(将所有必填字段) - 然后使用 JPA 将它们存储到数据库中,然后调用 JPA 来获取 @ 列表987654326@s 并验证所有字段(您在创建实例时设置的)是否包含与从数据库获得的值相同的值?
  • 是的......所以......假设我有一个导入脚本,将这些对象插入数据库,然后我还有一个服务,它从许多其他服务中获取这些信息并将它们放在一起进入 Person 对象。我需要的正是断言那些返回的对象就是我需要的。

标签: spring-boot jpa integration-testing junit4


【解决方案1】:

我认同3分:

1) 调用被测方法,该方法使用专用于您的实体的 JpaRepository 保存和刷新实体实例

2) 确保您的集成测试可靠/有价值
这里重要的是清除 JPA (EntityManager.clear()) 的一级缓存以测试从数据库中的实际检索。缓存可能会隐藏映射中的某些问题,这些问题仅在从数据库中实际找到对象时才会显示。

3) 断言预期行为,即从数据库中检索保存的实体并根据您的预期断言其状态。

对于断言对象的字段,AssertJ 可能会让您感兴趣。
它不会强迫你覆盖equals()/hashCode(),它非常简单且有意义。
当您要断言嵌套对象时,我建议按对象使用不同的 assertThat()
例如:

Person person = new Person()...;
// action
personRepository.saveAndFlush(person);

// clear the first level cache
em.clear();

// assertions
Optional<Person> optPerson = personRepository.findById(person.getId());

// JUnit
Assert.assertTrue(optPerson.isPresent()); 
// AssertJ
person = optPerson.get();
Assertions.assertThat(person)
          .extracting(Person::getName, Person::getLastName)                     
          .containsExactly("expected name", "expected last name");

Assertions.assertThat(person.getAccount())
          .extracting(Account::getFoo, Account::getBar)                     
          .containsExactly("expected foo", "expected bar");

Assertions.assertThat(person.getAddress())
          .extracting(Address::getStreet, Address::getZip)                     
          .containsExactly("expected street", "expected zip");

【讨论】:

  • 首先感谢您的回答。但在这种情况下,您只断言一个对象。我想知道如何断言几十个对象,考虑过滤和排序。
  • 断言多个对象其实并不复杂;但是过滤和排序是什么意思?你想断言一个实际的列表。
猜你喜欢
  • 2016-07-25
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2013-02-18
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多