我的阅读器配置如下:
<bean name="reader" class="...Reader" scope="step">
<property name="from" value="#{jobParameters[from]}" />
<property name="to" value="#{jobParameters[to]}" />
<property name="pageSize" value="5"/>
<property name="saveState" value="false" /> <!-- we use a database flag to indicate processed records -->
</bean>
并对它进行测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:testApplicationContext.xml"})
@ActiveProfiles({"default","mock"})
@TestExecutionListeners( {StepScopeTestExecutionListener.class })
public class TestLeadsReader extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private ItemStreamReader<Object[]> reader;
public StepExecution getStepExecution() {
StepExecution execution = MetaDataInstanceFactory.createStepExecution();
execution.getExecutionContext().putLong("campaignId", 1);
execution.getExecutionContext().putLong("partnerId", 1);
Calendar.getInstance().set(2015, 01, 20, 17, 12, 00);
execution.getExecutionContext().put("from", Calendar.getInstance().getTime());
Calendar.getInstance().set(2015, 01, 21, 17, 12, 00);
execution.getExecutionContext().put("to", Calendar.getInstance().getTime());
return execution;
}
@Test
public void testMapper() throws Exception {
for (int i = 0; i < 10; i++) {
assertNotNull(reader.read());
}
assertNull(reader.read());
}
现在,虽然pageSize和saveState被正确地注入我的阅读器,但作业参数却没有。根据文档,这是它需要完成的所有事情,我发现的唯一问题是使用jobParameters [&#39;来自&#39;]而不是jobParameters [from]。知道什么可能是错的吗?
另外,在我的阅读器进入测试方法之前没有调用open(executionContext)方法,这是不行的,因为我使用这些作业参数来检索调用read方法时需要可用的一些数据。这可能与上述问题有关,因为关于使用后期绑定的测试的文档说&#34;读者被初始化并绑定到输入数据&#34;。
答案 0 :(得分:0)
您正在将from
和to
设置为测试中的步执行上下文变量。但是在您的应用程序上下文配置中,您将其作为作业参数进行检索。您应该在单元测试中将它们设置为作业参数。
此外,如果要调用open / update / close ItemStream
生命周期方法,则应执行该步骤。见http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/test/JobLauncherTestUtils.html#launchStep-java.lang.String-org.springframework.batch.core.JobParameters-