#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
}
}