2010-11-02 10 views
5

Ho un'applicazione batch complicata e voglio verificare che le mie ipotesi sul flusso siano corrette.Qual è il modo migliore per verificare il flusso di lavoro in Spring-Batch?

Ecco una versione molto semplificata di quello che sto lavorando 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 è il lavoro che voglio provare. Voglio solo testare la transizione di step2.master in step3 o step4. Non voglio assolutamente testare il passaggio 1 ...

Tuttavia, voglio mantenere intatte le specifiche di Job1, poiché questo test sta testando la configurazione, non le azioni sottostanti. Ho già dei test di accettazione per testare le cose end-to-end. Questo esempio è così che posso scrivere test mirati per piccole variazioni senza creare test separati end-to-end per ogni caso limite.

Quello che voglio testare è che quando il lavoro all'interno di step2 fallisce, step2.master mi inoltrerà al punto 4 e non al passaggio 3. C'è un buon modo per testarlo?

risposta

8

È possibile sostituire il passaggio 2 con un'implementazione fittizia che non riesce sempre e utilizzare un StepExecutionListener per verificare se sono stati chiamati step3 e step4.

ci sono buoni esempi qui: http://static.springsource.org/spring-batch/reference/html/testing.html#endToEndTesting

+0

Ma cosa succede se step1 è un'azione molto complessa che non voglio testare, e ci sono altre azioni complesse non rappresentate da questo esempio? Fondamentalmente, voglio SOLO testare che un errore all'interno del lavoro partizionato mi manderà al passo successivo corretto, e non a nessuno degli altri elementi che stanno succedendo. –

+2

È possibile sostituire i lavori complessi con implementazioni fittizie che forniscono solo tutto ciò che è necessario per il lavoro successivo (se ci sono delle dipendenze). Ad esempio, supponi che step1 legga un db e generi un file in una cartella. Sostituiscilo con una simulazione che sposta un file di prova nella cartella di output. – esmiralha

+0

Quindi, in sostanza, dovrei creare una seconda configurazione per verificare se un'altra configurazione potrebbe funzionare ... Sì, posso facilmente verificare che funzioni "alcuni" ... posso anche verificare facilmente che la mia configurazione specifica funzioni? –

2

è possibile testare ogni passo separatamente. Esempio:

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()) 

spero che aiuta.

Problemi correlati