测试Step-Scoped组件" class="reference-link">10.4 测试Step-Scoped组件

时常组件在运行的时候需要配置你的步骤使用步骤并且迟绑定注入上下文从步骤或者是任务执行。这些是机警的测试像单独的组件除非你有一个办法设置上下文就像他们在一个步骤里执行。那是两个组件的目标在spring batch中:StepScopeTestExecutionListener 和 StepScopeTestUtils

这个监听是公开的在类级别中,它的工作是创建一个步骤为每个测试方法执行上下文。例如:

  1. @ContextConfiguration
  2. @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class,
  3. StepScopeTestExecutionListener.class })
  4. @RunWith(SpringJUnit4ClassRunner.class)
  5. public class StepScopeTestExecutionListenerIntegrationTests {
  6. // This component is defined step-scoped, so it cannot be injected unless
  7. // a step is active...
  8. @Autowired
  9. private ItemReader<String> reader;
  10. public StepExecution getStepExection() {
  11. StepExecution execution = MetaDataInstanceFactory.createStepExecution();
  12. execution.getExecutionContext().putString("input.data", "foo,bar,spam");
  13. return execution;
  14. }
  15. @Test
  16. public void testReader() {
  17. // The reader is initialized and bound to the input data
  18. assertNotNull(reader.read());
  19. }
  20. }

有两个TestExecutionListeners,一个来自普通的Spring测试框架和处理配置应用上下文的依赖注入,注入reader和其他的Spring batch StepScopeTestExecutionListener.它以一个stepExecution在测试用例中寻找一个工厂方法为动力,并且使用它如同测试方法的上下文。在运行时在一个步骤内如果它运行是活动的。通过工厂方法的签名检测到工厂方法(它仅仅有返回一个StepExecution)。如果一个工厂方法不被提供,会有一个默认的StepExecution被创建

这个监听方法是方便的,如果你想在测试方法中执行持续的step scope。为了更灵活,但是更侵入性的方法你能使用StepScopeTestUtils。例如,去计算可用产品的数量在reader上面:

  1. int count = StepScopeTestUtils.doInStepScope(stepExecution,
  2. new Callable<Integer>() {
  3. public Integer call() throws Exception {
  4. int count = 0;
  5. while (reader.read() != null) {
  6. count++;
  7. }
  8. return count;
  9. }
  10. });