Есть ли какой-либо способ расширить класс @Configuration, чтобы включить параметр конструктора?

#java #spring-boot #integration-testing #spring-test #spring-boot-test

#java #spring-boot #интеграция-тестирование #spring-test #spring-boot-test

Вопрос:

Я пишу интеграционные тесты для Spring Batch проекта, который имеет следующую конфигурацию

 @Configuration
@EnableScheduling
@PropertySource("application.properties")
public class BatchConfig(
     private JobBuilderFactory factory;
     public BatchConfig(JobBuilderFactory factory) {
           this.factory = factory;
     }
     
     @Bean
     public Step someStep {
       // step implementation
     }
}
  

Я создал следующий базовый тестовый класс

 @ContextConfiguration(classes=BatchConfig.class)
@SpringBootTest
public class BatchTestBase {
       @Autowired 
       Step someStep
}
  

Когда я расширяю этот класс и пытаюсь его запустить, я получаю следующую ошибку

Для параметра 0 конструктора в BatchConfig требовался компонент типа JobBuilderFactory, который не удалось найти

Есть ли какой-либо способ расширить BatchConfig до XML или добавить параметры конструктора здесь, чтобы получить доступ к компонентам?

Комментарии:

1. Что вам, вероятно , следует сделать, так это иметь @TestConfiguration класс, который предоставляет JobBuilderFactory компонент. Обратите внимание, что @SpringBootTest (который гласит «запустите приложение, поскольку оно действительно будет собрано, за исключением того, что я мог бы издеваться над некоторыми компонентами) обычно не сочетается с @ContextConfiguration , который предназначен для предоставления конфигурации, специфичной для теста.

Ответ №1:

Попробуйте ввести через set вместо constructor, как показано ниже :

  public setFactory(JobBuilderFactory factory) {
           this.factory = factory;
 }
  

Ответ №2:

Создайте конфигурацию контекста тестирования и используйте вместе с конфигурацией, которую необходимо протестировать в @ContextConfiguration

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        BatchTestBase.ContextConfiguration.class,
        BatchConfig.class
})
public class BatchTestBase {

    @Configuration
    static class ContextConfiguration {
        @Bean
        JobBuilderFactory factory() {
            //return fake, mock or stub
        }

    }

    @Autowired
    Step someStep;

    @Test
    public void shouldExecuteStep() {
       //some test
    }
}