我没有经验。我开始学习测试。这个存储库正确吗?如何测试?
public class Person extends Auditable<String> implements Serializable {
@Id
@Tsid
private Long id;
private String firstname;
private String surname;
private String patronymic;
@Temporal(TemporalType.DATE)
private LocalDate issue;
@Temporal(TemporalType.DATE)
private LocalDate expiry;
private String authority;
@Temporal(TemporalType.DATE)
private LocalDate birthDay;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL,orphanRemoval = true)
private List<Anamnesis> anamnesis=new ArrayList<>();
}
public interface PersonRepository extends JpaRepository<Person, Long> {
@Query(value =
"""
SELECT person.* FROM person
INNER JOIN anamnesis ON person.id = anamnesis.person_id
INNER JOIN employee ON employee.id = anamnesis.employee_id
INNER JOIN department ON employee.department_id = department.id
WHERE department.clinic_id = :id
ORDER BY person.firstname ASC
LIMIT :size OFFSET (:page * :size);
""",
nativeQuery = true)
List<Person> findAll(Long id, Integer page, Integer size);
}
我认为 JUnit 测试是不明智的。我的情况如何测试?
这篇文章中包含了很多问题。
这个存储库正确吗?
我们该如何辨别?我们不知道您尝试建模的要求。
如何测试?
一些自动测试肯定会很好。因此,拥有一个包含已定义数据集的存储库。运行查询。由于您知道存储库中的数据,因此您也知道预期的响应是什么。对足够的数据运行足够的查询,这样您就可以放心地说存储库是否按预期工作。
我认为 JUnit 测试是不明智的。我的情况如何测试?
JUnit 测试本身并不是不明智的。内存数据库不一定是唯一的方法。你需要保证的是上述机制能够发挥作用:
定义数据库内容,运行测试,将结果与期望进行比较。
如果您希望测试并行执行,您可能需要并行许多数据库。如果它们按顺序执行,您最终可能只有一个数据库。
也许它不是最快的,但我在 MariaDB 上按顺序运行测试(我认为 JUnit 无论如何都会默认这样做)。然后我在测试设置方法中添加了一个干净的脚本(删除所有表)和一个创建/填充脚本。
这意味着对于每个测试,在触发一些查询之前都会清理并从头开始创建数据库。它使我能够预测预期的结果。 这也意味着我的 CI/CD 管道需要在后台有一个 MariaDB,并且测试需要一些时间来执行。
但最终我可以确定数据库和应用程序按预期协同工作 - 否则测试就会失败。