2015-04-15 13 views
7

L'essenza è che il framework di test Spring Batch (v2) ha JobLauncherTestUtils.setJob con un'annotazione @Autowired. La nostra suite di test ha più provider di classe Job. Dal momento che questa classe non è qualcosa che posso modificare, non sono sicuro di sapere qual è il lavoro con cui viene eseguito l'autowiring, che potrebbe essere diverso per test.Come posso qualificare un setter autoagulato che non "proprietario"

STDOUT [WARN ] [2015.04.15 11:14:42] support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobLauncherTestUtilsForSnapshot': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.batch.test.JobLauncherTestUtils.setJob(org.springframework.batch.core.Job); nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.batch.core.Job] is defined: expected single matching bean but found 2: coverageRuleBatch,generateMetricsSnapshotJob 

Ho provato ad aggiungere questa JavaConfig che è riconosciuto, ma l'errore dice che è ancora autocalling setJob

@Configuration 
public class SpringTestConfiguration 
{ 
@Bean 
public JobLauncherTestUtils jobLauncherTestUtilsForSnapshot(final Job generateMetricsSnapshotJob) 
{ 
    JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); 
    jobLauncherTestUtils.setJob(generateMetricsSnapshotJob); 
    return jobLauncherTestUtils; 
} 
} 

nota: Non ho bisogno di una soluzione JavaConfig, ma sarebbe bello . Inoltre, mi piacerebbe, se possibile, continuare a pubblicare campi come JobRepository, poiché ce n'è uno solo.

+0

http://stackoverflow.com/q/22416140/206466 correlati, forse duplicati – xenoterracide

risposta

2

La soluzione mi è venuta

@Configuration 
public class SpringBatchTestConfiguration 
{ 
@Bean 
public static JobLauncherTestUtils jobLauncherTestUtilsForSnapshot() 
{ 
    return new SnapshotJobLauncherTestUtils(); 
} 

public static class SnapshotJobLauncherTestUtils extends JobLauncherTestUtils 
{ 
    @Override 
    @Qualifier("generateMetricsSnapshotJob") 
    public void setJob(final Job job) 
    { 
     super.setJob(job); 
    } 
} 
} 

e nella prova finale

@Autowired 
@Qualifier("jobLauncherTestUtilsForSnapshot") 
protected JobLauncherTestUtils jobLauncherTestUtils; 

abbastanza sicuro che potrei semplicemente annotare i miei TestUtils con @Component e denominarlo correttamente e fare la stessa cosa.

0

Forse potresti usare i profili Spring per quello. Assegnare un profilo diverso per ogni definizione di fagioli Job fornitore (con l'annotazione @Profile("profileName"), e poi attivare il profilo per il provider corretta sulla classe test specifico con l'annotazione @ActiveProfiles("profileName").

2

La mia soluzione, quando mi sono imbattuto nello stesso problema, è stato quello di limitare la componente-scan in modo che solo un singolo chicco di lavoro è stato creato nel contesto di prova.

@Configuration 
@ComponentScan(basePackages={ 
    "com.example.batch.jobs.metrics", //package where generateMetricsSnapshotJob is the only job 
    "com.example.batch.common", 
    "..." 
}) 
public class SpringTestConfiguration 
{ 
    @Bean 
    public JobLauncherTestUtils jobLauncherTestUtils() 
    { 
     //generateMetricsSnapshotJob and other requirements will be autowired 
     return new JobLauncherTestUtils(); 
    } 
} 

potrebbe essere necessario modificare la struttura del pacchetto per far funzionare tutto questo.

0
  1. È possibile estendere AutowiredAnnotationBeanPostProcessor e sovrascrivere il metodo di iniezione .

  2. Rimuovere <context:scan .. /> voci

  3. Pubblica il tuo fagioli <bean class ="a.b.CustomAutowiredAnnotationBeanPostProcessor" />

0

Un'altra soluzione gentile è iniettare via setter. Preferisco questa soluzione perché è più chiara e più facile.

@Configuration 
public class SpringTestConfiguration 
{ 
    @Bean 
    public JobLauncherTestUtils jobLauncherTestUtilsForSnapshot() 
    { 
     return new JobLauncherTestUtils() { 
      @Override 
      @Autowired 
      public void setJob(@Qualifier("generateMetricsSnapshotJob") Job job) { 
       super.setJob(job); 
      } 
     }; 
    } 
} 
Problemi correlati