这是我想测试的步骤范围的项目读取器,在读取字符串列表之前应该在@BeforeStep中初始化
@Slf4j
@Component
@StepScope
@RequiredArgsConstructor
public class SomeItemReader implements ItemReader<String> {
@Value("#{jobParameters['date']}")
private String date;
private List<String> stringList;
private final SomeService someService; //its inteface
@BeforeStep
public void init() {
stringList = new LinkedList<>(someService.getList(LocalDate.parse(date)));
}
@Override
public String read() {
return !stringList.isEmpty() ? stringList.remove(0) : null;
}
并测试
@ContextConfiguration
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
StepScopeTestExecutionListener.class})
@RunWith(SpringRunner.class)
class SomeItemReaderTest {
@Autowired
private SomeItemReader someItemReader;
public StepExecution getStepExecution() {
StepExecution execution = MetaDataInstanceFactory.createStepExecution();
execution.getExecutionContext().putString("input.data", "foo,bar,spam");
return execution;
}
@Test
void read() {
assertNotNull(someItemReader.read());//always get NPE here
}
}
我错过了什么或它不可能测试它?
1条答案
按热度按时间mznpcxlj1#
@BeforeStep
注解的方法在执行步骤(涉及读取器)之前执行。在测试中,没有步骤运行,因此您不应该期望调用此方法。此外,您在
date
字段中注入了一个作业参数,但测试并没有准备任何作业参数,而是在步骤执行上下文中添加了键/值par["input.data"="foo,bar,spam"]
,读取器不使用它。因此,要回答您关于如何测试配置了job参数的step-scoped bean的问题,您需要:
1.创建使用作业参数准备的步骤执行
1.将reader声明为Springbean,以便根据需要进行代理
1.在测试类中自动连接读取器,并使用
StepScopeTestUtils.doInStepScope
模拟步骤范围内的执行下面是一个完整的示例(基于Spring Batch 5和JUnit 5):