【问题标题】:Service layer testing: Is it still unit testing when using dbUnit and not mocking a native Spring domain layer?服务层测试:使用 dbUnit 并且不模拟原生 Spring 域层时,它仍然是单元测试吗?
【发布时间】:2017-09-11 11:53:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java spring unit-testing spring-data dbunit


    【解决方案1】:

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

    这样,让我们​​开始吧:

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

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

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

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

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

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

    【讨论】:

    • 谢谢,是的,您正确理解了一切。是的,我看到了担忧。我想我会去模拟领域层并进行干净的单元测试。这样,测试类看起来也更干净了。无论如何,我将通过我的 REST 接口进行集成测试。假设,使用整个spring上下文时它仍然是单元测试吗?
    • 如果非要使用spring上下文,我倾向于说还是集成测试。根据我对 spring 的经验,我已经能够在服务层上编写单元测试,而无需提升上下文,但我不喜欢你的鞋子。通常我使用基于构造函数的注入,它更容易创建类并在创建类时传递模拟。最后,如果您可以有效地模拟其他层,它将主要表现为单元测试。
    【解决方案2】:

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

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

    有很多测试类型,我看到和实现的最常见的是单元、集成、验收和性能。所有都是有价值的,并且有不同的优点/缺点。质量体系最好拥有所有类型。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2021-03-26
      • 2020-06-03
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多