diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java index 2cd86e8d4..3f4841b65 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java @@ -266,6 +266,7 @@ public class TaskletStep extends AbstractStep { try { try { result = tasklet.execute(contribution, chunkContext); + Assert.state(result != null, "Tasklet execution must return a non-null RepeatStatus."); } catch (Exception e) { if (transactionAttribute.rollbackOn(e)) { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java index d67b0cc41..3d9c3ba67 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java @@ -843,6 +843,24 @@ public class TaskletStepTests { } + @Test + public void testTaskletExecuteReturnNull() throws Exception { + step.setTasklet(new Tasklet() { + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + return null; + } + }); + JobExecution jobExecutionContext = new JobExecution(jobInstance); + StepExecution stepExecution = new StepExecution(step.getName(), jobExecutionContext); + step.execute(stepExecution); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); + List exceptions = stepExecution.getFailureExceptions(); + assertEquals(1, exceptions.size()); + Throwable exception = exceptions.get(0); + assertTrue(exception instanceof IllegalStateException); + assertEquals("Tasklet execution must return a non-null RepeatStatus.", exception.getMessage()); + } + private static class JobRepositoryStub extends JobRepositorySupport { private int updateCount = 0;