2010-11-02 24 views
5

Tengo una aplicación por lotes complicada, y quiero probar que mis suposiciones sobre el flujo son correctas.¿Cuál es la mejor manera de probar el flujo de trabajo en Spring-Batch?

Aquí es una versión muy simplificada de lo que estoy trabajando con:

<beans> 
    <batch:job id="job1"> 
    <batch:step id="step1" next="step2"> 
     <batch:tasklet ref="someTask1"/> 
    </batch:step> 
    <batch:step id="step2.master"> 
     <batch:partition partitioner="step2Partitioner" 
      step="step2" /> 
     <batch:next on="*" to="step3" /> 
     <batch:next on="FAILED" to="step4" /> 
    </batch:step> 
    <batch:step id="step3" next="step3"> 
     <batch:tasklet ref="someTask1"/> 
    </batch:step> 
    <batch:step id="step4" next="step4"> 
     <batch:tasklet ref="someTask1"/> 
    </batch:step> 
    </batch:job> 
    <batch:job id="job2"> 
    <batch:step id="failingStep"> 
     <batch:tasklet ref="failingTasklet"/> 
    </batch:step> 
    </batch:job> 

    <bean id="step2Partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner" scope="step"> 
    <property name="resources" value="file:${file.test.resources}/*" /> 
    </bean> 

    <bean id="step2" class="org.springframework.batch.core.step.job.JobStep"> 
    <property name="job" ref="job2" /> 
    <property name="jobLauncher" ref="jobLauncher" /> 
    <property name="jobRepository" ref="jobRepository" /> 
    </bean> 
</beans> 

Job1 es el trabajo que quiero probar. Realmente solo quiero probar la transición de step2.master a step3 o step4. No deseo probar step1 en absoluto ...

Sin embargo, quiero mantener la especificación de Job1 intacta, ya que esta prueba está probando la configuración, no las acciones subyacentes. Ya tengo pruebas de aceptación para probar cosas de extremo a extremo. Este ejemplo es para poder escribir pruebas específicas para pequeñas variaciones sin crear pruebas separadas de extremo a extremo para cada caso de borde.

Lo que quiero probar es que cuando el trabajo dentro del paso 2 falla, step2.master me enviará al paso 4 y no al paso 3. ¿Hay una buena manera de probar esto?

Respuesta

8

Puede reemplazar el paso 2 con una implementación simulada que siempre falla y usar un StepExecutionListener para verificar si se invocaron o no los pasos 3 y 4.

hay buenos ejemplos aquí: http://static.springsource.org/spring-batch/reference/html/testing.html#endToEndTesting

+0

Pero, ¿y si el paso 1 es una acción muy compleja que no quiero probar, y hay otras acciones complejas que no se representan en este ejemplo? Básicamente, SÓLO quiero probar que un error dentro del trabajo particionado me enviará al siguiente paso correcto, y no a ninguna de las otras cosas que están sucediendo. –

+2

Puede reemplazar los trabajos complejos con implementaciones simuladas que solo proporcionan lo que sea necesario para el próximo trabajo (si hay alguna dependencia). Por ejemplo, supongamos que step1 lee un archivo db y genera un archivo en una carpeta. Reemplace eso con un simulacro que mueve un archivo de prueba a la carpeta de salida. – esmiralha

+0

Así que básicamente debería crear una segunda configuración para verificar si otra configuración funcionaría ... Sí, puedo verificar fácilmente que "alguna" configuración funciona ... ¿puedo verificar fácilmente que mi configuración específica funciona? –

2

Usted puede probar cada etapa por separado. Ejemplo:

JobLauncherTestUtil jobLauncherTestUtil = new JobLauncherTestUtil(); 
jobLauncherTestUtil.setJobLauncher(jobLauncher); 
jobLauncherTestUtil.setJob(job); 
jobLauncherTestUtil.setJobRepository(jobRepository); 
Map<String, JobParameter> params = Maps.newHashMap(); 
//determine job params here: 
params.put(....); 
JobParameters jobParams = new JobParameters(params); 
ExecutionContext context = new ExecutionContext(); 
//put something to job context, if you need. 
context.put(...); 
JobExecution jobExecution = jobLauncherTestUtil.launchStep("stepId",jobParams,context); 

Assert.assertEquals("Step stepId failed", ExitStatus.COMPLETED, execution.getExitStatus()) 

espero que ayude.

Cuestiones relacionadas