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

Service layer testing: Is it still unit testing when using dbUnit and not mocking a native Spring domain layer?

我有一个服务层和一个领域层。我为域层使用纯原生 Spring 存储库,在我的测试设置中,我使用 dbunit 模拟数据库。

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

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

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

我假设领域层不需要测试,而且我使用 dbunit 来模拟我的数据库,我是否可以使用此设置进行我的单元测试服务层?

如果我理解正确,在你的测试中,Spring 上下文被引导,你的服务层与你的域层一起被测试,并且数据使用 DBUnit 插入到你的测试数据库中。

那么,让我们开始吧:

My general knowledge about unit testing is that I would need to mock my domain layer when writing unit tests for my service layer.

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

With my assumption that the domain layer does not need to be tested, and the with the fact, that I use dbunit to mock my database, am I allowed to use this setup for unit tests of my service layer?

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

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

这两种方法各有利弊(单元与集成)。如果它可以帮助您以质量和良好的可维护性发展项目,那么就没有 "right" 或 "wrong" 方法。

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

  • 单元测试仅涉及被测试的小代码单元,并模拟任何其他交互。
  • 集成测试涉及更广泛的系统范围和外部服务,例如使用数据库服务器测试 SQL 以及使用电子邮件服务器发送电子邮件。在这两种情况下,我们都使用 "test doubles" 而不是真正的生产环境来验证系统是否与外部服务正确交互。

测试类型很多,我看到和实施最多的是单元、集成、验收和性能。都是有价值的,都有不同的pros/cons。质量体系最好是所有类型都有。