具有修改后的查询的 JPA 存储库。如何测试?

问题描述 投票:0回答:1

我没有经验。我开始学习测试。这个存储库正确吗?如何测试?

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 测试是不明智的。我的情况如何测试?

java spring testing spring-data-jpa spring-test
1个回答
0
投票

这篇文章中包含了很多问题。

这个存储库正确吗?

我们该如何辨别?我们不知道您尝试建模的要求。

如何测试?

一些自动测试肯定会很好。因此,拥有一个包含已定义数据集的存储库。运行查询。由于您知道存储库中的数据,因此您也知道预期的响应是什么。对足够的数据运行足够的查询,这样您就可以放心地说存储库是否按预期工作。

我认为 JUnit 测试是不明智的。我的情况如何测试?

JUnit 测试本身并不是不明智的。内存数据库不一定是唯一的方法。你需要保证的是上述机制能够发挥作用:

定义数据库内容,运行测试,将结果与期望进行比较。

如果您希望测试并行执行,您可能需要并行许多数据库。如果它们按顺序执行,您最终可能只有一个数据库。

也许它不是最快的,但我在 MariaDB 上按顺序运行测试(我认为 JUnit 无论如何都会默认这样做)。然后我在测试设置方法中添加了一个干净的脚本(删除所有表)和一个创建/填充脚本。

这意味着对于每个测试,在触发一些查询之前都会清理并从头开始创建数据库。它使我能够预测预期的结果。 这也意味着我的 CI/CD 管道需要在后台有一个 MariaDB,并且测试需要一些时间来执行。

但最终我可以确定数据库和应用程序按预期协同工作 - 否则测试就会失败。

© www.soinside.com 2019 - 2024. All rights reserved.