Как создать несколько интеграционных тестов с помощью CommandLineJobRunner в java - PullRequest
0 голосов
/ 29 марта 2020

Я запускаю интеграционные тесты, используя CommandLineJobRunner из Spring Batch. Если я запускаю его один за другим, то он работает отлично, но когда я собираю его чистым и устанавливаю, он не движется вперед, он застревает в бесконечном ожидании.

например: Запуск job.eg.egJobIT ... .

 package job.eg;
    import com.**;

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    @ContextConfiguration(locations = { "classpath:*.xml"})
    @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
    @TestPropertySource("classpath:application.properties")
    public class EgJobIT {

        @Autowired
        @Qualifier(value="EG_JOB")
        private Job job;

        @Autowired
        private JobLauncher jobLauncher;

        @Autowired
        private JobRepository jobRepository;

        @Test
        public void launchJob() throws Exception {

            JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();

            jobParametersBuilder.addString("legacy.date.format", "yyyyMMdd");

            JobParameters jobParameters = jobParametersBuilder.toJobParameters();

            String[] jobParamArr = MapUtil.mapToString(jobParameters);

            String[] contextParam = new String[] { "file:src/test/resources/*.xml", "EG_JOB" };
            String[] args = Stream.of(contextParam, jobParamArr).flatMap(Stream::of).toArray(String[]::new);

            final Queue<Integer> exitCode = new ArrayBlockingQueue<Integer>(1);
            CommandLineJobRunner.presetSystemExiter(new SystemExiter() {
                @Override
                public void exit(int status) {
                    exitCode.add(status);
                }
            });
//here it is calling main() method.
            CommandLineJobRunner.main(args);
            Assert.assertEquals(0, exitCode.poll().intValue());
        }
    }

Примечание: пожалуйста, пометьте * как некоторое имя класса или файла конфигурации.

1 Ответ

0 голосов
/ 02 апреля 2020

Я не вижу веской причины использовать CommandLineJobRunner в модульном тесте, если только вы не доверяете коду из Spring Batch.

В типичном тестовом модуле работы используется JobLauncher или JobLauncherTestUtils как указано здесь: https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/testing.html#testing

Так что в вашем случае, так как вы вводите работу и средство запуска задания в своем тестовом классе, вы можете написать что-то вроде:

@Test
public void launchJob() throws Exception {
   // given
   JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
   jobParametersBuilder.addString("legacy.date.format", "yyyyMMdd");
   JobParameters jobParameters = jobParametersBuilder.toJobParameters();

   // when
   JobExecution jobExecution = jobLauncher.run(job, jobParameters);

   // then
   Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...