服务层测试:使用dbUnit时是否还在进行单元测试,而不是模拟原生的Spring域层?

问题描述:

我有一个服务层和一个领域层。我使用普通的本地Spring存储库作为域层,在我的测试设置中,我使用dbunit来嘲弄数据库。服务层测试:使用dbUnit时是否还在进行单元测试,而不是模拟原生的Spring域层?

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

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

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

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

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

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

我对单元测试的常识是,我需要为我的业务层编写单元测试时,嘲笑我的域名层。

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

随着我的假设是,领域层并不需要进行测试,并与事实,我使用DbUnit嘲笑我的数据库,我是允许使用此设置为我服务层的单元测试?

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

至于最后一个问题,那么,如果这种设置正在为您的项目,我想这是好的,但我不会把它单元测试,但集成测试。你必须接受,如果你的域名层出于某种原因改变了,它可能会破坏你的服务层测试。

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

+0

谢谢,是的,你正确地理解了一切。是的,我看到了这个问题。我想我会嘲笑域图层并进行干净的单元测试。这样,测试类也看起来更清洁。无论如何,我将通过我的REST界面进行集成测试。假设,在使用整个春天环境时它仍然是一个单元测试吗? –

+0

如果我不得不使用spring context,我倾向于说它仍然是一个集成测试。在我对Spring的经验中,我已经能够在服务层上编写单元测试,而不需要提高上下文,但我不会在这个问题上着迷。通常我使用基于构造函数的注入,创建类并在创建类时通过模拟更容易。最后,如果你可以有效地模拟其他层,它将主要作为一个单元测试。 –

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

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

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