【问题标题】:Integration testing for a single service mocking/stubbing some of the injected components模拟/存根某些注入组件的单个服务的集成测试
【发布时间】:2014-10-14 19:39:31
【问题描述】:

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

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

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

如果我想使用嵌入式 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 数据存储库都照常构建和实例化,一切都按预期正常工作。

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

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

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

非常欢迎您提供有关该主题的帮助。

【问题讨论】:

  • 您遵循或建议的方法有什么更新吗?我也需要类似的要求。

标签: integration-testing mockito spring-boot spring-test


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 2013-01-03
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2021-04-05
    • 2016-08-19
    相关资源
    最近更新 更多