当前位置: 首页 > 知识库问答 >
问题:

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

乐正峰
2023-03-14

我有一个服务层和一个域层。我在域层使用纯本机Spring存储库,在测试设置中,我用dbunit模拟db。

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

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

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

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

共有2个答案

宇文飞羽
2023-03-14

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

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

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

郗浩言
2023-03-14

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

有了这个,让我们开始:

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

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

假设不需要测试域层,并且我使用dbunit模拟数据库,那么允许我使用此设置对服务层进行单元测试吗?

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

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

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

 类似资料:
  • 在我的项目中,我在进行单元测试时遇到了问题。一个问题是,仅仅进行联调就可以更快地编写,并且还可以测试组件是否真正协同工作。单元测试新颖的“算法”之类的似乎要容易得多。单元测试服务类感觉是错误和无用的。 我使用mockito来模拟spring数据存储库(以及DB访问)。问题是,如果我告诉模拟存储库在方法调用getById时返回实体A,它显然会返回实体A,服务也会返回实体A。是的,该服务做了一些额外的

  • 我已经开始考虑在我的项目中围绕一些业务逻辑添加一些单元测试。 我想测试的第一个方法是服务层中的一个方法,它返回给定节点的子节点列表。 该方法如下所示: 我想象这样的测试方法是提供一个假树结构,然后测试提供节点是否返回正确的子节点。 ssdsContext是一个对象上下文。 我已经看到可以为提取和接口如何模拟ObjectContext或ObjectQuery 我还读到,as Entity Frame

  • 我正在尝试为服务层方法编写单元测试,按名称查找播放器。该方法调用JPA存储库方法并返回页面对象。我希望测试验证是否确实调用了存储库中的正确方法。 测试类 我的问题 测试失败,并显示以下消息: 根据建议,我将名称更改为eq(名称),但这导致了一个不同的问题: 有什么建议我应该在考试中改变什么? 服务类 存储库界面

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 我正在用Kotlin做一个Spring Boot项目。 目前我正在尝试编写单元测试,因此我使用Mockk,尤其是springmockk。 这是我的RecipeService类: 我的测试类看起来像这样: 当试图在我的服务中注入模拟存储库时,我会遇到以下问题: 组织。springframework。豆。工厂UnsatifiedPendencyException:创建名为“nl”的bean时出错。wh

  • 我想对一个组件的功能进行单元测试。因此,我需要一个模拟服务(根据角度测试指南)。 这里是我的测试床: 那么,嘲笑服务价值的正确方法是什么呢? 弗兰克