2015-04-15 13 views
7

Ý chính là khung kiểm tra Lô mùa xuân (v2) có JobLauncherTestUtils.setJob với chú thích @Autowired. Bộ thử nghiệm của chúng tôi có nhiều nhà cung cấp lớp học Job. Vì lớp này không phải là một cái gì đó tôi có thể sửa đổi, tôi không chắc chắn làm thế nào tôi có thể đủ điều kiện mà công việc nó được autowired với, mà có thể khác nhau cho mỗi thử nghiệm.Làm thế nào tôi có thể hội đủ điều kiện cho trình thiết lập tự động mà tôi không "sở hữu"

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 

Tôi đã thử thêm JavaConfig này được công nhận, nhưng lỗi nói nó vẫn autocalling setJob

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

lưu ý: Tôi không đòi hỏi một giải pháp JavaConfig, nhưng nó muốn được tốt đẹp . Ngoài ra, tôi muốn, nếu có thể, vẫn còn các trường Autowire như JobRepository, vì chỉ có một.

+0

http://stackoverflow.com/q/22416140/206466 liên quan, có thể trùng lặp – xenoterracide

Trả lời

2

Các giải pháp tôi đã đưa ra

@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); 
    } 
} 
} 

và trong các thử nghiệm chính thức

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

khá tự tin Tôi chỉ có thể chú thích TestUtils của tôi với @Component và đặt tên cho nó đúng cách và thực hiện tương tự.

0

Có thể bạn có thể sử dụng Hồ sơ mùa xuân cho điều đó. Gán một hồ sơ khác nhau để mỗi định nghĩa bean Job nhà cung cấp (với chú thích @Profile("profileName"), và sau đó kích hoạt cấu hình cho các nhà cung cấp chính xác trên lớp thử nghiệm cụ thể với các chú thích @ActiveProfiles("profileName").

2

Giải pháp của tôi, khi tôi chạy vào cùng một vấn đề, là để hạn chế các thành phần quét để chỉ một bean Job duy nhất được tạo ra trong bối cảnh thử nghiệm.

@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(); 
    } 
} 

bạn có thể cần phải điều chỉnh cấu trúc gói của bạn để làm việc này.

0
  1. Bạn có thể mở rộng AutowiredAnnotationBeanPostProcessor và ghi đè phương pháp tiêm .

  2. Di <context:scan .. /> mục

  3. đăng ký đậu của bạn <bean class ="a.b.CustomAutowiredAnnotationBeanPostProcessor" />

0

Giải pháp loại khác là tiêm nó thông qua setter. Tôi thích giải pháp này vì rõ ràng hơn và dễ dàng hơn.

@Configuration 
public class SpringTestConfiguration 
{ 
    @Bean 
    public JobLauncherTestUtils jobLauncherTestUtilsForSnapshot() 
    { 
     return new JobLauncherTestUtils() { 
      @Override 
      @Autowired 
      public void setJob(@Qualifier("generateMetricsSnapshotJob") Job job) { 
       super.setJob(job); 
      } 
     }; 
    } 
} 
Các vấn đề liên quan