Spring boot 断言集合中每个元素的集成测试
考虑使用SpringBoot和JUnit测试从数据库返回的集合是否包含所有所需元素的IT。最好的方法是什么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) 调用测试中的方法,该
说明,考虑一个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对象中。我需要的正是断言那些返回的对象就是我需要的对象。首先,谢谢你的回答。但在这种情况下,您只声明一个对象。我想知道如何断言几十个对象,考虑过滤和排序;但是你所说的过滤和排序是什么意思呢?您通常希望断言一个实际的列表。