服务层测试:使用dbUnit时是否仍然是单元测试而不是模拟本机Spring域层?

问题描述 投票:3回答:2

我有一个服务层和一个域层。我使用普通的本机Spring存储库作为域层,在我的测试设置中,我用dbunit模拟数据库。

@Repository
public interface ExampleRepository extends PagingAndSortingRepository<ExampleEntity, Long>, JpaSpecificationExecutor<ExampleEntity> {
}

当然,我将假设Spring存储库实现没有错误,因此域层不受测试。

我对单元测试的一般知识是,在为服务层编写单元测试时,我需要模拟我的域层。

我假设域层不需要进行测试,事实上,我使用dbunit来模拟我的数据库,我可以使用这个设置来进行服务层的单元测试吗?

java spring unit-testing spring-data dbunit
2个回答
4
投票

如果我理解正确,在您的测试中,Spring上下文被提升,您的服务层将与您的域层一起进行测试,并使用DBUnit将数据插入您的测试数据库中。

有了它,让我们开始:

我对单元测试的一般知识是,在为服务层编写单元测试时,我需要模拟我的域层。

如果你想进行单元测试,那么这是正确的。您描述测试的方式,它取决于两个层是否正确,并且DB必须运行,因此,根据定义,它们是集成测试。

我假设域层不需要进行测试,事实上,我使用dbunit来模拟我的数据库,我可以使用这个设置来进行服务层的单元测试吗?

我不会将DBunit称为数据库模拟。它肯定有助于填充数据库,但仍然需要DB来运行测试,并且将执行您的域层(JPA,Hibernate或任何ORM框架将生成将针对DB执行的SQL)。如果你真的想要模拟域层和数据库,那么你应该考虑使用模拟(许多模拟库可以帮助你)。

至于最后一个问题,如果这个设置适用于你的项目,我想它没关系,但我不会称它为单元测试,而是集成测试。您必须接受,如果您的域层由于某种原因发生变化,它可能会破坏您的服务层测试。

两种方法都有利弊(单位与整合)。如果它有助于您以高质量和良好的可维护性来扩展您的项目,那么就没有“正确”或“错误”的方法。


1
投票

不,使用dbUnit进行测试是集成测试。

  • 单元测试仅涉及测试中的一小部分代码,模拟任何其他交互。
  • 集成测试涉及具有外部服务的更广泛的系统范围,例如使用数据库服务器测试SQL并使用电子邮件服务器发送电子邮件。在这两种情况下,我们使用“测试双打”而不是真实的生产来验证系统是否与外部服务正确交互。

有许多测试类型,我看到和实现的最常见的是单元,集成,接受和性能。所有这些都是有价值的,有不同的优点/缺点最好是所有类型的质量系统。

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