我正在开发一个多层和多模块的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方法和注释,并执行对此特定实体的测试。
为了模拟对象,我使用了fixture对象(假对象)。但是,由于这种关系,我正在进行大量工作来测试实体之间的持久性。这样的问题:在保存对象之前必须恢复数据库的非空属性(字段)取决于他。
我的怀疑是:
我感谢你的帮助!
答案 0 :(得分:2)
从我的角度来看,你专注于错误的事情。
我想测试这些实体是否在数据库中正确保持它们的关系。
这看起来像测试JPA实现(在这种情况下是Hibernate)是否正确实现。测试持久性本身并没有那么有意义,因为在这种情况下,您正在测试外部系统而不是代码。
如果您需要真正测试持久性,则应使用以下方案:
@Test
public void persistingUser_ShouldWorkCorrectly() {
// arrange
User user = createUser();
// act
userDAO.save(user);
// assert
assertThat(user).hasName(...)
.livesInCity(...)
.livesInCountry(...);
}