Spring boot 断言集合中每个元素的集成测试

Spring boot 断言集合中每个元素的集成测试,spring-boot,jpa,integration-testing,junit4,Spring Boot,Jpa,Integration Testing,Junit4,考虑使用SpringBoot和JUnit测试从数据库返回的集合是否包含所有所需元素的IT。最好的方法是什么 说明,考虑一个JPA类/实体,例如: class Person { Integer id; String name; String lastName; Address address; Account account; } 考虑到个人、地址和账户的ID将自动生成,因此我无法推断它们 任何帮助都将不胜感激。I身份3点: 1) 调用测试中的方法,该

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

说明,考虑一个JPA类/实体,例如:

class Person {

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

}
考虑到
个人
地址
账户
的ID将自动生成,因此我无法推断它们

任何帮助都将不胜感激。

I身份3点:

1) 调用测试中的方法,该方法用于保存实体实例,并使用专用于实体的JpaRepository刷新实体实例

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

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

对于断言对象的字段,AssertJ可能会引起您的兴趣。
它不会强制您重写
equals()/hashCode()
,它非常简单且有意义。
当您想要断言嵌套对象时,我建议使用一个不同的
assertThat()
by-object。
例如:

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");
Person-Person=newperson()。。。;
//行动
personRepository.saveAndFlush(person);
//清除第一级缓存
em.clear();
//断言
可选optPerson=personRepository.findById(person.getId());
//朱尼特
Assert.assertTrue(optPerson.isPresent());
//资产
person=optPerson.get();
断言。断言(人)
.Extraction(Person::getName,Person::getLastName)
.containsExactly(“预期姓名”、“预期姓氏”);
Assertions.assertThat(person.getAccount())
.Extraction(帐户::getFoo,帐户::getBar)
.containsExactly(“预期的foo”、“预期的bar”);
Assertions.assertThat(person.getAddress())
.提取(地址::getStreet,地址::getZip)
.containsExactly(“预期街道”、“预期拉链”);

你的意思是问你如何创建2个或更多的
Person
实例(所有必填字段)-然后使用JPA将它们存储到DB中,然后通过JPA调用获取
Person
的列表,并验证所有字段(创建实例时设置的字段)是否包含与从DB获得的值相同的值?是。。。一般。。。假设我有一个将这些对象插入数据库的导入脚本,然后我还有一个服务,它将来自许多其他服务的信息汇集到Person对象中。我需要的正是断言那些返回的对象就是我需要的对象。首先,谢谢你的回答。但在这种情况下,您只声明一个对象。我想知道如何断言几十个对象,考虑过滤和排序;但是你所说的过滤和排序是什么意思呢?您通常希望断言一个实际的列表。