我有一个ItemProcessor
,它有一个@BeforeStep
方法来访问ExecutionContext
:
public class MegaProcessor implements ItemProcessor<String, String> {
private ExecutionContext context;
@BeforeStep
void getExecutionContext(final StepExecution stepExecution) {
this.context = stepExecution.getExecutionContext();
}
@Override
public String process(final String string) throws Exception {
// ...
}
}
这个类的单元测试:
@ContextConfiguration(classes = MegaProcessor.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class })
@RunWith(SpringRunner.class)
public class MegaProcessorTest {
@Autowired
private MegaProcessor sut;
public StepExecution getStepExecution() {
StepExecution execution = MetaDataInstanceFactory.createStepExecution();
execution.getExecutionContext().put("data", "yeah");
return execution;
}
@Test
public void MegaProcessor() throws Exception {
assertNotNull(sut.process("pew pew"));
}
}
当我调试测试运行时,context
是null
,@BeforeStep
方法从未被调用。为什么会这样?如何实现?
1条答案
按热度按时间ttcibm8c1#
为什么会这样
如果你想使用
StepScopeTestExecutionListener
,测试的组件应该是step-scoped(参见Javadoc)。在你的例子中不是这样的。但这不是真实的的问题。真正的问题是,在执行你的处理器注册的步骤之前,用@BeforeStep
注解的方法将被调用。在你的测试用例中,没有步骤运行,所以方法永远不会被调用。如何做到这一点?
由于它是一个单元测试,你可以假设步骤执行将在运行步骤之前通过Spring Batch传递给你的item processor,并在你的单元测试中模拟/存根它。这就是我如何对组件进行单元测试:
当你有一个step-scoped组件,使用后期绑定从步骤执行上下文获取值时,
StepScopeTestExecutionListener
很方便。例如:这个阅读器的单元测试应该是这样的:
希望这个有用。