我有一个服务层和一个域层。我使用普通的本机Spring存储库作为域层,在我的测试设置中,我用dbunit
模拟数据库。
@Repository
public interface ExampleRepository extends PagingAndSortingRepository<ExampleEntity, Long>, JpaSpecificationExecutor<ExampleEntity> {
}
当然,我将假设Spring存储库实现没有错误,因此域层不受测试。
我对单元测试的一般知识是,在为服务层编写单元测试时,我需要模拟我的域层。
假设我不需要测试域层,并且事实上,我使用dbunit
来模拟我的数据库,我可以使用此设置来进行服务层的单元测试?
答案 0 :(得分:4)
如果我理解正确,在您的测试中,Spring上下文会被提升,您的服务层将与您的域层一起进行测试,并使用DBUnit将数据插入您的测试数据库中。
有了这个,让我们开始吧:
我对单元测试的一般知识是,在为服务层编写单元测试时,我需要模拟我的域层。
如果您想进行单元测试,那么这是正确的。您描述测试的方式,它取决于两个层是否正确,并且DB必须运行,因此,根据定义,它们是集成测试。
我假设域层不需要测试,事实上,我使用dbunit来模拟我的数据库,我可以使用这个设置来进行服务层的单元测试吗?
我不会将DBunit称为数据库模拟。它肯定有助于填充数据库,但仍然需要DB来运行测试,并且将执行您的域层(JPA,Hibernate或任何ORM框架将生成将针对DB执行的SQL)。如果你真的想要模拟域层和数据库,那么你应该考虑使用模拟(许多模拟库可以帮助你)。
至于最后一个问题,如果这个设置适合你的项目,我想它没关系,但我不会称之为单元测试,但是集成测试。您必须接受,如果您的域层由于某种原因发生变化,它可能会破坏您的服务层测试。
两种方法都有利弊(单位与整合)。如果它能帮助您提高质量和良好的可维护性,那么就没有“正确”或“错误”的方法。
答案 1 :(得分:1)
不,使用dbUnit进行测试是集成测试。
有许多测试类型,我看到和实现的最常见的是单元,集成,接受和性能。所有这些都是有价值的,有不同的优点/缺点最好是为质量体系提供所有类型。