2017-02-15 30 views
0

У меня есть весеннее пакетное приложение с одним заданием, которое выполняется двумя шагами. Я хотел бы иметь возможность тестировать каждый шаг индивидуально, без необходимости запуска другого. Это возможно? Мой код выглядит следующим образом:Как протестировать один шаг в Spring Batch без запуска других?

@Bean 
public Job job() throws Exception { 
    return jobs.get("job") 
      .incrementer(new RunIdIncrementer()) 
      .listener(new JobCompletionNotificationListener()) 
      .start(A) 
      .next(B) 
      .build(); 
} 


@Test 
public void testStepA() { 
    JobExecution execution = launcher.launchStep("A"); 
    assertEquals(BatchStatus.COMPLETED, execution.getStatus()); 
} 

Но когда я запускаю тест выше, он, по сути, запускает и выполняет всю мою работу спереди назад.

ответ

0

Предполагая, что вы используете тестовые примеры JUnit, вы можете использовать JobLauncherTestUtils для запуска определенного шага. Вам также потребуется создать экземпляр ExecutionContext через MetaDataInstanceFactory, который передается методу JobLauncherTestUtils.launchStep().

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:/batch/test-job.xml" }) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class }) 
public class StepTest { 
    @Autowired 
    private JobLauncherTestUtils jobLauncherTestUtils; 
    private JobExecution jobExecution; 
    public ExecutionContext getExecutionContext() { 
     return MetaDataInstanceFactory.createJobExecution().getExecutionContext(); 
    } 

    @Test 
    @DirtiesContext 
    public void testStep() { 
     ExecutionContext executionContext = getExecutionContext(); 
     jobExecution = jobLauncherTestUtils.launchStep(<STEP_NAME>, <JOB_PARAMS>, executionContext); 
    } 
} 

Надеюсь, что это поможет!