2626import org .springframework .batch .core .JobParameters ;
2727import org .springframework .batch .core .JobParametersBuilder ;
2828import org .springframework .batch .core .Step ;
29+ import org .springframework .batch .core .StepExecution ;
2930import org .springframework .batch .core .configuration .annotation .EnableBatchProcessing ;
3031import org .springframework .batch .core .configuration .annotation .StepScope ;
3132import org .springframework .batch .core .job .builder .JobBuilder ;
@@ -70,10 +71,44 @@ void testChunkOrientedStep() throws Exception {
7071
7172 // then
7273 Assertions .assertEquals (ExitStatus .COMPLETED , jobExecution .getExitStatus ());
74+ StepExecution stepExecution = jobExecution .getStepExecutions ().iterator ().next ();
75+ Assertions .assertEquals (ExitStatus .COMPLETED , stepExecution .getExitStatus ());
76+ Assertions .assertEquals (2 , stepExecution .getReadCount ());
77+ Assertions .assertEquals (2 , stepExecution .getWriteCount ());
78+ Assertions .assertEquals (2 , stepExecution .getCommitCount ());
79+ Assertions .assertEquals (0 , stepExecution .getRollbackCount ());
7380 JdbcTemplate jdbcTemplate = new JdbcTemplate (context .getBean (DataSource .class ));
7481 Assertions .assertEquals (2 , JdbcTestUtils .countRowsInTable (jdbcTemplate , "person_target" ));
7582 }
7683
84+ @ Test
85+ void testChunkOrientedStepFailure () throws Exception {
86+ // given
87+ System .setProperty ("fail" , "true" );
88+ ApplicationContext context = new AnnotationConfigApplicationContext (TestConfiguration .class );
89+ JobLauncher jobLauncher = context .getBean (JobLauncher .class );
90+ Job job = context .getBean (Job .class );
91+
92+ // when
93+ JobParameters jobParameters = new JobParametersBuilder ()
94+ .addString ("file" , "persons1.csv" )
95+ .toJobParameters ();
96+ JobExecution jobExecution = jobLauncher .run (job , jobParameters );
97+
98+ // then
99+ Assertions .assertEquals (ExitStatus .FAILED .getExitCode (), jobExecution .getExitStatus ().getExitCode ());
100+ StepExecution stepExecution = jobExecution .getStepExecutions ().iterator ().next ();
101+ ExitStatus stepExecutionExitStatus = stepExecution .getExitStatus ();
102+ Assertions .assertEquals (ExitStatus .FAILED .getExitCode (), stepExecutionExitStatus .getExitCode ());
103+ Assertions .assertTrue (stepExecutionExitStatus .getExitDescription ().contains ("Unable to process item Person[id=1, name=foo1]" ));
104+ Assertions .assertEquals (0 , stepExecution .getReadCount ());
105+ Assertions .assertEquals (0 , stepExecution .getWriteCount ());
106+ Assertions .assertEquals (0 , stepExecution .getCommitCount ());
107+ Assertions .assertEquals (1 , stepExecution .getRollbackCount ());
108+ JdbcTemplate jdbcTemplate = new JdbcTemplate (context .getBean (DataSource .class ));
109+ Assertions .assertEquals (0 , JdbcTestUtils .countRowsInTable (jdbcTemplate , "person_target" ));
110+ }
111+
77112 @ Configuration
78113 @ EnableBatchProcessing
79114 static class TestConfiguration {
@@ -95,7 +130,12 @@ public FlatFileItemReader<Person> itemReader(@Value("#{jobParameters['file']}")
95130
96131 @ Bean
97132 public ItemProcessor <Person , Person > itemProcessor () {
98- return item -> new Person (item .id (), item .name ().toUpperCase ());
133+ return item -> {
134+ if (System .getProperty ("fail" ) != null ) {
135+ throw new Exception ("Unable to process item " + item );
136+ }
137+ return new Person (item .id (), item .name ().toUpperCase ());
138+ };
99139 }
100140
101141 @ Bean
0 commit comments