Конечная тестовая конфигурация Spring Batch не работает - PullRequest
0 голосов
/ 26 апреля 2019

Я следовал официальному руководству по пакетной обработке Spring (https://spring.io/guides/gs/batch-processing/)) и успешно выполнил пример. Для той же работы я пытаюсь создать комплексный интеграционный тест. Особенно я использую только тестовую конфигурацию. В моем тесте я определяю все необходимые bean-компоненты. Таким образом, это должна быть единственная конфигурация, необходимая для запуска задания. Это дает большую гибкость. Тест завершается неудачно при создании ApplicationContext. Жалуется, что не может найти источник данных. Когда я Запустите само приложение, так как я использую базу данных в памяти. Spring автоматически создает в базе данных источник данных и таблицы, связанные с пакетами Spring. Но когда я запускаю свой тест, он не создает базу данных автоматически. Как я могу запустить Spring? что?

В моей тестовой конфигурации, когда я добавил явную конфигурацию бина источника данных, он создал источник данных, но не создал таблицы базы данных, относящиеся к пружинным пакетам.

Ниже приведен код теста:

@SpringBatchTest
@RunWith(SpringRunner.class)
public class PersonJobTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void testPersonJob() throws Exception{

        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
    }


    @Configuration
    @EnableBatchProcessing
    public static class JobConfig {

        @Autowired
        public JobBuilderFactory jobBuilderFactory;

        @Autowired
        public StepBuilderFactory stepBuilderFactory;

        private JdbcTemplate simpleJdbcTemplate;

        @Bean
        public FlatFileItemReader<Person> reader() {
            return new FlatFileItemReaderBuilder<Person>()
                    .name("personItemReader")
                    .resource(new ClassPathResource("sample-data.csv"))
                    .delimited()
                    .names(new String[]{"firstName", "lastName"})
                    .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                        setTargetType(Person.class);
                    }})
                    .build();
        }

        @Bean
        public PersonItemProcessor processor() {
            return new PersonItemProcessor();
        }

        @Bean
        @Autowired
        public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
            return new JdbcBatchItemWriterBuilder<Person>()
                    .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                    .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
                    .dataSource(dataSource)
                    .build();
        }

        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }

        @Bean
        public JobCompletionNotificationListener getListener(JdbcTemplate jdbcTemplate){
            return new JobCompletionNotificationListener(jdbcTemplate);
        }

        @Bean
        public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
            return jobBuilderFactory.get("importUserJob")
                    .incrementer(new RunIdIncrementer())
                    .listener(listener)
                    .flow(step1)
                    .end()
                    .build();
        }

        @Bean
        public Step step1(JdbcBatchItemWriter<Person> writer) {
            return stepBuilderFactory.get("step1")
                    .<Person, Person> chunk(10)
                    .reader(reader())
                    .processor(processor())
                    .writer(writer)
                    .build();
        }
    }


}

файл pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.intuit.iip.dg.dgworkflow</groupId>
    <artifactId>dg-workflow-springbatch-poc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dg-workflow-springbatch-poc</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

При запуске теста я хочу, чтобы Spring Boot автоматически настраивал источник данных, а также создавал таблицы, связанные с Spring Batch, как это происходит при запуске реального приложения.

1 Ответ

0 голосов
/ 29 апреля 2019

Для этого нужно использовать аннотацию @SpringBootTest. Более того, вам не нужно копировать конфигурацию задания внутри теста. Вот тест, который проходит с руководством по началу работы:

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.batch.test.context.SpringBatchTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.assertEquals;

@SpringBatchTest
@SpringBootTest
@RunWith(SpringRunner.class)
public class PersonJobTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void testPersonJob() throws Exception{
        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...