我有一个 Spring boot + 批处理应用程序,它读取源 CSV 文件,处理它并写入目标 CSV 文件,我正在努力编写测试:使用输入 - “simpleFlowInput.csv”并比较“simpleFlowActual.csv” ” 输出带有“simpleFlowExpected.csv”文件,我想编写其中的许多测试,但很难做到这一点。
我的申请只包含一个步骤和一项工作:
@Bean("csvFileToFileStep")
public Step csvFileToFileStep() {
return stepBuilderFactory.get("csvFileToFileStep").<RowInput, RowOutput>chunk(10000).reader(csvRowsReader()).processor(csvRowsProcessor())
.writer(compositeItemWriter()).build();
}
@Bean("csvFileToCsvJob")
Job csvFileToCsvJob(JobCompletionNotificationListener listener) {
return jobBuilderFactory.get("csvFileToCsvJob").incrementer(new RunIdIncrementer()).listener(listener).flow(csvFileToFileStep()).end()
.build();
}
Run Code Online (Sandbox Code Playgroud)
我目前的测试:
@RunWith(SpringJUnit4ClassRunner.class)
@Configuration
@EnableBatchProcessing
@SpringBootTest
public class Tester{
@Autowired
Job csvFileToCsvJob;
@Autowired
Step csvFileToFileStep;
@Autowired
CsvFileReadProcessAndWriteConfig csvFileReadProcessAndWriteConfig;
private JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils();
@Test
public void testSimpleFlow() throws Exception {
ClassLoader classLoader = getClass().getClassLoader();
File fileInput = new File(classLoader.getResource("simpleFlowInput.csv").getFile());
File fileActual = new File(classLoader.getResource("simpleFlowActual.csv").getFile());
File fileExpected …Run Code Online (Sandbox Code Playgroud) 我有一个读者知道如何读取包含 14 列的 CSV 文件,我希望它能够接收包含许多列(~500)的文件并只读取这 14 列,我知道解决方案应该包括 FieldSetMapper (根据这个问题:read only selected columns from csv file using spring batch)但我找不到合适的例子。这是我当前的读者:
@Bean
public FlatFileItemReader<RowInput> csvRowsReader() {
FlatFileItemReader<RowInput> reader = new FlatFileItemReader<>();
Resource resource = new FileSystemResource(new File(FileManager.getInstance().getInputFileLocation()));
reader.setResource(resource);
reader.setLinesToSkip(1);
reader.setLineMapper(new DefaultLineMapper<RowInput>(){{
setLineTokenizer(new DelimitedLineTokenizer(){{
setNames(new String[]{"Field_1", "Field_2", "Field_3", "Field_4", "Field_5",
"Field_6", "Field_7", "Field_8", "Field_9", "Field_10", "Field_11",
"Field_12", "Field_13", "Field_14"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<RowInput>(){{
setTargetType(RowInput.class);
}});
}});
reader.setLinesToSkip(1);
return reader;
}
Run Code Online (Sandbox Code Playgroud)
例外的是:
引起原因:org.springframework.batch.item.file.transform.In CorrectTokenCountException:记录中找到的令牌数量不正确:预期 14 实际 544
我尝试使用的 FieldSetMapper:
public class InputFieldSetMapper implements …Run Code Online (Sandbox Code Playgroud)