Actualmente estoy trabajando en un proyecto de arranque de primavera que usa lote de primavera. Estoy tratando de usar JavaConfig en lugar de xml pero es difícil con todos los documentos actualmente en xml.
Seguí https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-5-modular-configurations pero tengo dificultades para usar JobLauncherTestUtils . Sé que necesito decirle a la prueba que use el contexto de primavera correcto, pero parece que no puedo encontrar la manera de hacerlo. Obtuve el siguiente error:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.batch.test.JobLauncherTestUtils' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}Mi prueba se parece a la siguiente:
@RunWith(SpringRunner.class) @SpringBootTest(classes = {MyApplication.class, MyJobConfiguration.class}) public class RetrieveDividendsTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Test public void testSomething() throws Exception { jobLauncherTestUtils.launchJob(); } }Me encontré con el mismo problema y eché un vistazo a esta configuración XML de las muestras de Spring Batch. Basado en eso, logré que funcionara con:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = { BatchTest.BatchTestConfig.class }) public class BatchTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Test public void demo() throws Exception { JobExecution jobExecution = jobLauncherTestUtils.launchJob(); Assert.assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); } @Configuration @EnableBatchProcessing static class BatchTestConfig { @Bean JobLauncherTestUtils jobLauncherTestUtils() { return new JobLauncherTestUtils(); } // rest omitted for brevity } } La prueba tiene éxito y mi ItemWriter registra los elementos procesados como se esperaba.
Para la versión spring Batch 4.1.x o superior, podemos usar la anotación @SpringBatchTest que inyectará automáticamente jobLauncherTestUtils , consulte el ejemplo de muestra para obtener más detalles aquí
Así es como puede crear si no puede actualizar a 4.1.x o superior
@Bean public JobLauncherTestUtils getJobLauncherTestUtils(){ return new JobLauncherTestUtils() { @Override @Autowired public void setJob(@Qualifier("myjobname") Job job) { super.setJob(job); } }; }¿Tiene lo siguiente en su pom.xml?
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency>Si no me equivoco, y usa Spring Boot, debería cargar los beans de configuración automática de Spring Batch para que estén disponibles para inyección.