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

模拟集成测试

湛钊
2023-03-14

如何模拟集成测试所需的许多依赖关系?

我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。

现在是集成测试。假设在这种情况下,集成测试将测试以下内容:

  1. 消息被放入队列

我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、html" target="_blank">文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需要验证副作用。

这些依赖项中的每一个都由一个无状态服务类包装,这使得它们很好并且可以模仿。

大家是怎么处理的?

我很乐意使用Mockito,这样我就可以验证上述流程的副作用。然而,Mocktio的文档(在很大程度上是它的实现)似乎强烈反对在“纯”单元测试之外的环境中使用它。我试过走这条路,但是

  • 很难填充存根数据(因为存根数据很多)

编辑

我知道我可以用HSQLDB实例之类的东西来处理数据库问题,但仍然存在外部服务的问题。对于可重复性,我不能依赖于这些服务的启动、处于我所需要的状态等等。我看到的唯一选择就是模仿它们。

你在做什么?

共有3个答案

薛烈
2023-03-14

如果有一些http或rest模拟框架,那么使用它们应该很好。

所有复杂的依赖关系都可以被记录、修改和重放。

董高朗
2023-03-14

为了模拟数据库、网络服务、文件系统等,您可能需要重构一点。对于每个外部服务,您应该编写一个包装类,该包装类具有您希望执行的每个操作的方法。每个这样的方法应该没有实际的逻辑,只是以外部服务理解的方式传递其参数,并返回一个包含外部服务返回的任何数据的对象。例如,如果您正在与数据库交互,包装类可能会将其参数格式化为SQL语句,将它们提交到现有的连接对象中,并为结果返回一个列表。

因为包装类的方法不包含任何逻辑(即没有if/ther,没有循环和异常处理);不需要对包装类进行单元测试。您应该对包装类进行集成测试,以确保其职责正确执行(例如,SQL语句对数据库具有所需的效果)。

现在,重新编写与外部服务交互的类,以便它们与包装器类交互。然后就可以很容易地对它们进行单元测试——只需模拟包装器类。

何超英
2023-03-14

问得好。

你似乎达到了莫基托的极限。如果你想检查对象交互,Mockito是很棒的。

然而,你想要的似乎是更高抽象层次上的可观察性(和可控性)。我担心你需要的模拟或存根应该经过精心设计和手工制作。

在单元级,可以通过Mockito很好地生成这些模拟。在集成级别上,这变得更加困难,您将需要专门设计的可测试性接口。

 类似资料:
  • 我们有一些传统的laravel项目,它们在类中使用正面。 我们最近的项目使用了底层laravel类的依赖注入,facades所代表的类正如Taylor Otwell自己所暗示的那样。(我们对每个类使用构造函数注入,但为了保持示例简短,这里我使用方法注入并使用单个类。) 我知道外表是可以被嘲笑的 这对单元测试很有效。我试图理解的问题是,这些门面是否被“全球”嘲笑。 例如,让我们假设我正在编写一个集成

  • 我发现可以使用以下方法模拟和: 它工作得很好,但当我尝试运行集成测试时,授权服务器仍然需要启动并运行。否则,Quarkus无法连接到它。 我试图禁用OIDC扩展(),但是代码当然不能编译(endpoint不能识别依赖项)。 那么,在运行集成测试时,哪一种方法是跳过OIDC连接的最佳方法呢? 最好的,

  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。

  • 我正在用两个应用程序做project:android应用程序(客户端)和rest服务(服务器)。我的android应用程序消耗了我的rest服务。 这两个应用程序都是单独测试的,以确保它们按照预期完成业务。在服务器测试期间,我准备请求并检查服务器响应。在客户机测试期间,我设置了一个简单的http模拟服务器,并针对不同的模拟响应测试客户机的请求。 现在,这个技术很管用。它给了我一种我喜欢的灵活性。我

  • 在Spring Security中,我注入以从env变量读取凭据。在集成测试中,我希望模拟接口,以便更改测试的env变量。 下面是我的测试: 最好的方法是什么?

  • 情况和问题:在Spring Boot中,我如何将一个或多个模拟类/bean注入应用程序以进行集成测试?在StackOverflow上有一些答案,但它们集中在Spring Boot 1.4之前的情况,或者只是不适合我。 背景是,在下面的代码中,设置的实现依赖于第三方服务器和其他外部系统。设置的功能已经在单元测试中测试过了,所以对于完整的集成测试,我想模拟出对这些服务器或系统的依赖,只提供虚拟值。 M