在 Junit 测试中检索上下文值。
Retrieve context value within a Junit Test.
我有一个 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);
}
}
在 tasklet 中,当我使用 "diretorio" 和 "atividadesContext" 参数调用 service.criarArquivo 时,我想 return 一个 emissao 对象。
tasklet 是这样的:
@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 return 的 when 子句是一个空的 emissao 对象,因为它不是方法期望的参数。我可以使用 Mockito.any() 来做到这一点,但首先我想知道为什么我不能在 junit 测试中注入上下文对象。
当我 运行 作业以正常方式工作时,我可以正常注入 atividadesContext。
在 Spring 批处理单元测试中,我们使用了一个名为 JobSynchronizationManager
的组件(Step 也有等效组件)。在调用您的作业作用域 bean 之前,您将 JobExecution
注册到 JobSynchronizationManager
。这使得它可用于 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();
}
您可以在此处的文档中阅读有关 JobSynchronizationManager
的更多信息:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/scope/context/JobSynchronizationManager.html
我有一个 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);
}
}
在 tasklet 中,当我使用 "diretorio" 和 "atividadesContext" 参数调用 service.criarArquivo 时,我想 return 一个 emissao 对象。
tasklet 是这样的:
@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 return 的 when 子句是一个空的 emissao 对象,因为它不是方法期望的参数。我可以使用 Mockito.any() 来做到这一点,但首先我想知道为什么我不能在 junit 测试中注入上下文对象。
当我 运行 作业以正常方式工作时,我可以正常注入 atividadesContext。
在 Spring 批处理单元测试中,我们使用了一个名为 JobSynchronizationManager
的组件(Step 也有等效组件)。在调用您的作业作用域 bean 之前,您将 JobExecution
注册到 JobSynchronizationManager
。这使得它可用于 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();
}
您可以在此处的文档中阅读有关 JobSynchronizationManager
的更多信息:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/scope/context/JobSynchronizationManager.html