0

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

1) 使用标准 @SpringBootTest 和 @TestPropertySource(properties = {"spring.cloud.task.closecontext_enable=false"} 描述here

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

这似乎实际上只允许每个测试类进行一次测试,因为在初始化弹簧上下文时运行任务,即每个测试类一次。但是,@Autowiring 将上下文中的 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(设置在创建这些 bean 之后但在任务运行之前使用 MockRestServiceServer 的期望 - 这可能吗?如果不是,那么很难看到如何为任务编写有意义的集成测试。

4

1 回答 1

0

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

我在用着

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

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

然后我用

application.addListeners() 

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

然后运行任务

application.run(args);

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

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

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

于 2017-04-04T13:36:44.367 回答