代码之家  ›  专栏  ›  技术社区  ›  CRISTIAN ROMERO MATESANZ

使用jobLauncherTestUtils的Spring批处理集成测试

  •  1
  • CRISTIAN ROMERO MATESANZ  · 技术社区  · 8 年前

    我的集成测试定义:

    https://github.com/cristianprofile/spring-batch-testing/blob/master/src/test/java/test/BatchApplicationTests.java

    @RunWith(SpringRunner.class)
    @SpringBootTest
    
    /* @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;*/
    
    public class BatchApplicationTests {
    
    private static final String EXPECTED_FILE = "src/test/resources/users.csv";
    private static final String OUTPUT_FILE = "src/main/resources//users.csv";
    private static final String EXPECTED_FILE2 = "src/test/resources/users2.csv";
    private static final String OUTPUT_FILE2 = "src/main/resources//users2.csv";
    
    @Test
    public void contextLoads()  throws Exception{
        System.out.println("Fake test ");
    //      JobExecution jobExecution = jobLauncherTestUtils.launchJob();
    //        JobExecution jobExecution = jobLauncherTestUtils.launchStep("step1");
    //      Assert.assertEquals("COMPLETED",    jobExecution.getExitStatus().getExitCode());
    //
    //
    //       AssertFile.assertFileEquals(new FileSystemResource(EXPECTED_FILE),
    //                new FileSystemResource(OUTPUT_FILE));
    //
    //        AssertFile.assertFileEquals(new FileSystemResource(EXPECTED_FILE2),
    //                new FileSystemResource(OUTPUT_FILE2));
    
    }
    

    Spring配置测试文件夹:

    package test;
    
    import com.mymoid.batch.configuration.BatchConfiguration;
    import org.springframework.boot.SpringBootConfiguration;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.annotation.Import;
    
     @SpringBootConfiguration
     @EnableAutoConfiguration
     @Import({BatchTestConfig.class, BatchConfiguration.class})
     public class TestServiceConfigIT {
     }
    

    @Configuration
    public class BatchTestConfig {
    
    @Bean
    JobLauncherTestUtils jobLauncherTestUtils() {
        return new JobLauncherTestUtils();
    }
    
    }
    

    BatchConfiguration.class:

    @Configuration
    @EnableBatchProcessing
    public class BatchConfiguration {
    
    @Autowired
    public JobBuilderFactory jobBuilderFactory;
    
    @Autowired
    public StepBuilderFactory stepBuilderFactory;
    
    @Autowired
    public DataSource dataSource;
    
    @Bean
    public JdbcCursorItemReader<User> reader(){
        JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<User>();
        reader.setDataSource(dataSource);
        reader.setSql("SELECT id,name FROM user");
        reader.setRowMapper(new UserRowMapper());
        return reader;
    }
    
    
    
    @Bean
    public UserItemProcessor processor(){
        return new UserItemProcessor();
    }
    
    @Bean
    public FlatFileItemWriter<User> writer(){
        FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
    
        final FileSystemResource fileSystemResource = new FileSystemResource("/Users/mymoid/projects/batch/src/main" +
                "/resources/users.csv");
    
        FlatFileHeaderCallback prueba= new FlatFileHeaderCallback() {
            @Override
            public void writeHeader(Writer writer) throws IOException {
                writer.write("columna1,cloumna2");
            }
        };
        writer.setHeaderCallback(prueba);
        writer.setResource(fileSystemResource);
        writer.setLineAggregator(new DelimitedLineAggregator<User>() {{
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<User>() {{
                setNames(new String[] { "address.id", "address.name" });
            }});
        }});
    
        return writer;
    }
    
    
    @Bean
    public FlatFileItemWriter<User> writer2(){
        FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
        final FileSystemResource fileSystemResource = new FileSystemResource("/Users/mymoid/projects/batch/src/main" +
                "/resources/users2.csv");
    
        FlatFileHeaderCallback prueba= new FlatFileHeaderCallback() {
            @Override
            public void writeHeader(Writer writer) throws IOException {
                writer.write("columna1");
            }
        };
        writer.setHeaderCallback(prueba);
        writer.setResource(fileSystemResource);
        writer.setLineAggregator(new DelimitedLineAggregator<User>() {{
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<User>() {{
                setNames(new String[] { "id"});
            }});
        }});
    
        return writer;
    }
    
    
    
    
    @Bean
    public CompositeItemWriter compositeItemWritercomposite(){
        FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
        writer.setResource(new ClassPathResource("users2.csv"));
        writer.setLineAggregator(new DelimitedLineAggregator<User>() {{
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<User>() {{
                setNames(new String[] { "id"});
            }});
        }});
    
        final FlatFileItemWriter writer1 = writer();
        final FlatFileItemWriter<User>  userFlatFileItemWriter = writer2();
        List<ItemWriter<User>> writers = new ArrayList<>(2);
        writers.add(writer1);
        writers.add(userFlatFileItemWriter);
        CompositeItemWriter itemWriter = new CompositeItemWriter();
    
        itemWriter.setDelegates(writers);
        return itemWriter;
    }
    
    
    @Bean OrderWriter orderWriter()
    {
       return new OrderWriter();
    }
    
    
    
    
    
    
    
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1").<User, User> chunk(2)
                .reader(reader())
                .processor(processor())
                .writer(compositeItemWritercomposite())
                .build();
    }
    
    @Bean
    public Job exportUserJob() {
        return jobBuilderFactory.get("exportUserJob")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
    }
    
    }
    

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  3
  •   Mahmoud Ben Hassine    6 年前

    从 SpringBootTest 注释的 javadoc

    如果不使用嵌套的@Configuration,并且未指定显式类,则自动搜索@SpringBootConfiguration。

    在你的测试课上,你没有使用 @contextConfiguration

    spring.batch.job.enabled=false 给你的 application.properties

        2
  •  -1
  •   CRISTIAN ROMERO MATESANZ    8 年前

    我刚解决了这个问题,给它加了假值应用程序.属性(内部测试资源)值:

    spring.batch.job.enabled=false
    

    https://github.com/cristianprofile/spring-batch-testing/blob/master/src/test/resources/application.properties