Spring 在Junit测试中检索上下文值。

Spring 在Junit测试中检索上下文值。,spring,spring-batch,Spring,Spring Batch,我对tasklet进行了Junit测试,它类似于: @ContextConfiguration(locations = {"/context/job-runner-context.xml"}) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class }) @RunWith(SpringJUnit4ClassRunner.class)

我对tasklet进行了Junit测试,它类似于:

@ContextConfiguration(locations = {"/context/job-runner-context.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class InicializaTaskletTest extends BaseTeste {

    @Resource
    private ChunkContext chunkContext;


    @Before
    public void setUp() throws Exception {

    }

    @Test
    public void testExecutaTaskletInicializacao() throws Exception {
        AtividadesContext atividadesContext = create();
        ExecutionContext ctx = chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();
        ctx.put(ATIVIDADES_FOLHA, atividadesContext);
        when(service.criarArquivo(diretorio, atividadesContext)).thenReturn(new Emissao();
        RepeatStatus retorno = tasklet.execute(mock(StepContribution.class), chunkContext);
    }

}
@Value("#{jobExecutionContext['atividadesFolha']}")
private AtividadesContext atividadesContext;

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws IOException, AtividadeJaIniciadaException {
    EmissaoArquivoSpai emissao = arquivoSpaiService.criarArquivo(diretorioBaseArquivo, atividadesContext);

    return RepeatStatus.FINISHED;
}
在tasklet中,我希望在调用service.criarArquivo时,使用“diretorio”和“atividadesContext”参数返回emissao对象

tasklet类似于:

@ContextConfiguration(locations = {"/context/job-runner-context.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class InicializaTaskletTest extends BaseTeste {

    @Resource
    private ChunkContext chunkContext;


    @Before
    public void setUp() throws Exception {

    }

    @Test
    public void testExecutaTaskletInicializacao() throws Exception {
        AtividadesContext atividadesContext = create();
        ExecutionContext ctx = chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();
        ctx.put(ATIVIDADES_FOLHA, atividadesContext);
        when(service.criarArquivo(diretorio, atividadesContext)).thenReturn(new Emissao();
        RepeatStatus retorno = tasklet.execute(mock(StepContribution.class), chunkContext);
    }

}
@Value("#{jobExecutionContext['atividadesFolha']}")
private AtividadesContext atividadesContext;

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws IOException, AtividadeJaIniciadaException {
    EmissaoArquivoSpai emissao = arquivoSpaiService.criarArquivo(diretorioBaseArquivo, atividadesContext);

    return RepeatStatus.FINISHED;
}
}

问题是,当我执行junit测试时,atividadesContext的注入不起作用,或者无法将其正确地放入上下文中。test的when子句返回一个null emissao对象,因为它不是方法所期望的参数。我可以使用Mockito.any()来实现这一点,但首先我想了解为什么我不能在junit测试中注入上下文对象


当我以正常方式运行作业时,我可以正常地插入描述上下文

在Spring批处理单元测试中,我们使用了一个名为
JobSynchronizationManager
的组件(该步骤也有相应的组件)。在调用作业范围bean之前,请使用
JobSynchronizationManager
注册
jobsecution
。这使得
ApplicationContext
可用于布线目的

因此,看看您的测试,您可以将其结构如下:

@Test
public void testExecutaTaskletInicializacao() throws Exception {
    AtividadesContext atividadesContext = create();

    JobExecution jobExecution = new JobExecution(5l);
    ExecutionContext ctx = new ExecutionContext();
    ctx.put(ATIVIDADES_FOLHA, atividadesContext);
    jobExecution.setExecutionContext(ctx);

    JobSynchronizationManager.register(jobExecution);

    when(service.criarArquivo(diretorio, atividadesContext)).thenReturn(new Emissao());
    RepeatStatus retorno = tasklet.execute(mock(StepContribution.class), chunkContext);

    JobSynchronizationManager.release();
}

您可以在此处的文档中阅读有关作业同步管理器的更多信息:

是否有其他解决方案?我们的项目使用Springbatch2.1.9。我看到JobSynchronizationManager从3.0开始就在库api中。对步骤范围的bean使用步骤版本(
StepSynchronizationManager
)。