gpt4 book ai didi

java - 如何测试持久层?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:49 25 4
gpt4 key购买 nike

我正在开发一个多层和多模块的 Web 项目。对于持久层,我使用 JPA 2.1 和 Hibernate 4.2,对于测试 JUnit 4。在这个架构中,我的项目分为以下几类:

GenericDAO (interface);
GenericDAOImpl (implementation);
EntityDAOImpl (inherits from GenericDAOImpl);
GenericService (interface);
GenericServiceImpl (implementation);
EntityServiceImpl (inherits from GenericServiceImpl);
Entity (POJO).

实体可以是任何对象:用户、账户、城市、国家...

自然地,这些实体相互依赖并映射一对一、一对多、多对一和多对多。我想测试这些实体及其关系是否正确地保存在数据库中。

我开始使用 spring 提供的内存数据库 (HSQLDB) 开发测试。我创建了一个通用类测试 GenericServiceTest,用于测试我的类方法 GenericServicesImpl 并针对每个特定实体进行扩展,例如 EntityServiceTest。

然后,当您运行测试类 EntityServiceTest 时,位于 GenericServiceTest 类中的所有 JUnit 方法和注释都将被继承,并执行对该特定实体的测试。

为了模拟对象,我使用了夹具对象(假对象)。但是,正是由于这种关系,我正在做大量工作来测试实体之间的持久性。问题如:在保存依赖于他的对象之前必须恢复数据库的非空属性(字段)。

我的疑问是:

  • 是否有更好的方法来测试这种关系的持久性?
  • 以这种方式测试服务层是否很常见?
  • 一旦我测试服务层和持久层之间的集成,我可以说这种测试是集成测试吗?

感谢您的帮助!

最佳答案

在我看来,您关注的是错误的事情

I would like testing whether such entities are being persisted, with their relationships, correctly on database.

这看起来像是在测试 JPA 实现(在本例中为 Hibernate)是否正确实现。测试持久性本身没有多大意义,因为在这种情况下您正在测试外部系统而不是您的代码。

如果需要真正真正测试持久化,应该使用以下场景:

@Test
public void persistingUser_ShouldWorkCorrectly() {
// arrange
User user = createUser();

// act
userDAO.save(user);

// assert
assertThat(user).hasName(...)
.livesInCity(...)
.livesInCountry(...);
}

关于java - 如何测试持久层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com