【问题标题】:Spring Cloud Task Integration TestingSpring Cloud 任务集成测试
【发布时间】:2017-08-17 07:32:11
【问题描述】:

我正在寻找有关为 Spring Cloud Task 编写集成(即测试整个 Spring Boot 应用程序)的最佳方式的一些指导。 根据现有的文档和示例,我看到了两种方法:

1) 使用标准的 @SpringBootTest 和 @TestPropertySource(properties = {"spring.cloud.task.closecontext_enable=false"} 如此处所述

http://docs.spring.io/spring-cloud-task/docs/1.2.0.M2/reference/htmlsingle/#_writing_your_test

这似乎实际上只允许每个测试类进行一次测试,因为在初始化弹簧上下文时运行任务,即每个测试类一次。然而 @将上下文中的bean自动装配到测试类中应该可以检查任务的结果,或者检查任务存储库的状态。

2) 使用 SpringApplication.run(MyTaskApplication.class, myArguments);在此处的示例中的每个测试方法中

https://github.com/spring-cloud/spring-cloud-task/blob/master/spring-cloud-task-samples/batch-job/src/test/java/io/spring/BatchJobApplicationTests.java

这允许我在测试类中编写多个测试,每个测试都有可能不同的弹簧属性或批处理作业参数。

我在使用这两种方法时遇到的主要问题是,我看不到如何在 JdbcTemplate(例如,将作业的测试输入数据插入嵌入式数据库)或 RestTemplate(使用 MockRestServiceServer 设置期望) 在创建这些 bean 之后但在任务运行之前 - 这可能吗?如果不是,那么很难看出如何为任务编写有意义的集成测试。

【问题讨论】:

    标签: spring-cloud-task


    【解决方案1】:

    我现在所做的是上面方法 (2) 的变体(即我可以多次运行任务/在同一个测试类中有多个测试)

    我正在使用

    SpringApplication application = new SpringApplication(new Object[] {MyTaskApplication.class, TestConfig.class});
    

    TestConfig 在测试类中使用@TestConfiguration 定义,并包含覆盖实际bean 的模拟bean 等

    然后我用

    application.addListeners() 
    

    添加一个 ContextRefreshedEventListener,它允许我在创建 bean 之后但在任务运行之前设置对模拟的期望(或执行 jdbc 调用)。 (我有一个通用的 Listener 类,它允许我将行为作为 lambda 或每个 bean 的方法引用传递)

    然后用

    运行任务
    application.run(args);
    

    (可以在不同的测试中使用不同的参数)

    如果我想在测试运行后验证 mocks / db 状态,我也可以将 "--spring.cloud.task.closecontext_enable=false" 作为参数传递以保持应用程序打开。在这种情况下,我会在测试结束时手动关闭它。

    如果这似乎是一种明智的方法,那么如果 Spring Cloud Task 本身提供某种通用侦听器或钩子来允许在 bean 创建和任务执行之间设置测试状态,它可能会很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-08
      • 2017-10-30
      • 2019-01-19
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      相关资源
      最近更新 更多