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

针对单个服务的集成测试模拟/存根一些注入的组件

农波涛
2023-03-14

我已经阅读了数百篇文章和页面,但我无法找到正确的方法来进行集成测试,只模拟一些组件。

这是一个场景:我使用Spring Boot(1.2-snapshot)和各种Spring库创建了一个应用程序,还有Spring data JPA。

我有几个服务,例如Service1和Service2,它们使用Spring数据管理的其他组件和存储库。

如果我想使用嵌入式hsql数据库测试所有服务的完整集成测试,我会在测试包中以这种方式声明一个类:

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppConfig.class)
public class IntegrationTest {

  @Autowired
  private Service1 s1;

  @Autowired
  private Service2 s2;

  [... test methods ...]

}

其中AppConfig类位于我的主包中,并且是这样定义的:

@ComponentScan
@Configuration
@EnableAutoConfiguration
public class AppConfig {

  public static void main(String[] args) {
    SpringApplication.run(AppConfig.class, args);
  }

}

在集成测试期间,定义了一个完整的spring上下文,所有spring数据存储库都被构建并实例化为usuale,一切正常。

但是有两种情况我需要不同的目标:

1) 我想一次只测试一个服务(例如:Service1),例如,因为Service2初始化非常慢,我想在不同的测试类中测试它。我如何实现这个目标?问题是,我仍然需要所有依赖项注入,尤其是所有spring数据管理存储库,这些存储库由Service1自动连接。如果我没有使用spring数据存储库,我可以自己创建Service1类,然后手工连接所有依赖项,即使这样也会非常麻烦。

2) 在测试Service1时,我只想对他的所有依赖项中的一个进行mock/stub。例如,我将模拟一个在生产中连接到外部服务的组件。我不知道如何在spring上下文中选择性地注入存根对象,同时继续像往常一样使用所有其他对象。

非常欢迎在这个问题上提供一些帮助。

共有1个答案

司空俊悟
2023-03-14

您可以创建在不同配置文件上设置的不同测试bean,然后使用这些配置文件执行测试,而不是使用Mockito mock。

例如(当然,这只是一个如何实现的愿景,而不是确切的解决方案),您可以添加一个配置文件“fast”,并使用@ActiveProfiles(“fast”)运行测试。然后,您将使用@Profile('fast')注释测试配置,以设置您需要的所有bean

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

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

  • 我有以下用例: 问题2:为什么如果我只使用构造函数而不使用@Autowired或者反之亦然,那么一切都能正常工作,因为我没有加载Spring上下文...我有单元测试...

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

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

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