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

无法使用groovy/spock从端到端启动Spring批处理作业-集成测试

亢琦
2023-03-14

我最近开始进行groovy测试,以测试使用一个步骤(ItemReader、ItemProcessor、ItemWriter)的spring批处理作业

知道我正在使用h2内存数据库,我已尝试通过单元测试启动作业,但无法验证作业是否已完成:

    def 'test launch job'() {
    given:
    def projectId = 1234L
    def fileType = FileType.TEST
    def sourceId = 1234506L
    def enteredBy = 'groovy_unit_test'
    def prePlanYear = 2022L

    when:
 
    JobParametersBuilder builder = new JobParametersBuilder();
    builder.addLong("projectId", projectId)
            .addString("fileType", fileType.toString())
            .addLong("sourceId", sourceId)
            .addString("enteredBy", enteredBy)
            .addLong("prePlanYear", prePlanYear)
    //JobExecution jobExecution = jobLauncher.launchJob( builder.toJobParameters())
    JobExecution jobExecution = jobLauncher.launchStep(JobConstants.StepNames.xwalkMappingStep.name(), builder.toJobParameters())
  then: 'Job completes with no errors.'
   jobExecution.status == BatchStatus.COMPLETED
   //jobExecution.exitStatus == ExitStatus.COMPLETED
}

此外,当我试图调试它时,它不会从一端到另一端,而是在测试完成后在ItemReader中停止。我知道这不是等待工作完成。

有没有办法在工作完成后才完成测试?

@PropertySource('classpath:application.properties')
@ActiveProfiles('test')
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = ["spring.h2.console.enabled=true"])
@ImportAutoConfiguration([ FeignAutoConfiguration.class])
@Import([TestConfig.class])
class BaseSpec extends Specification{

    @PersistenceContext
    EntityManager entityManager

    @Autowired
    JobRepository jobRepository

    @Autowired
    DataSource dataSource

    @Autowired
    JpaTransactionManager jpaTransactionManager

    @Autowired
    JobLauncherTestUtils jobLauncher

}

@Configuration
@EnableBatchProcessing
class TestConfig {
}

非常感谢。

共有1个答案

毛缪文
2023-03-14

这是因为您没有运行整个作业,而只是在这里执行其步骤:

JobExecution jobExecution = jobLauncher.launchStep(JobConstants.StepNames.xwalkMappingStep.name(), builder.toJobParameters())

您应该使用JobLauncher#launchJob运行作业,而不仅仅是步骤。

 类似资料:
  • 我需要从远程SFTP服务器下载一个文件,并使用spring batch处理它们。我已经实现了使用Spring集成下载文件的代码。但我无法从Spring集成组件启动Spring批处理作业。我有以下代码: 但这不起作用(上一个方法中的错误),因为找不到文件类型的bean。我不能把这两部分连在一起。如何连接集成和批处理?

  • 我不确定我是否能清楚地解释我的情况。请建议您对spring-batch作业测试E2E流是否有其他更好的意见,以及您是否可以对上述方法提供任何清晰的说明,这将是有帮助的。

  • 我有一个正在工作的Spring Boot/批处理项目,包含2个作业。 我现在尝试添加集成,仅使用java配置/java DSL从远程SFTP轮询文件,然后启动作业。 文件轮询工作正常,但我不知道如何在我的流中启动作业,尽管阅读了以下链接: 一些代码段: 对于.handle(“FileMessageToJobRequest”,“ToRequest”),我使用的是http://docs.spring.

  • 是否可以配置Spring批处理管理员来启动主作业和从作业。我们有一个进程作为主节点和3-4个从节点。 Spring batch admin在单独的JVM进程中运行,但所有Spring批处理作业都使用相同的批处理数据库模式。

  • 我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中