Как исключить классы с @Configuration в тестировании @SpringBootApplication

Я использую зависимый модуль под названием spring-cloud-aws. Он имеет класс @Configuration как org.springframework.cloud.aws.messaging.config.annotation.SqsConfiguration. В моем тестовом примере SpringBoot JUnit обнаруживается класс SqsConfiguration и инициализируются Beans. Я хочу исключить эту конфигурацию из класса в своем тестовом примере JUNit. Как этого добиться?

Я пытался использовать @ComponentScan, но это не сработало.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SQLTestConfig.class)
@ActiveProfiles("test")
public class BusinessManagerTest {

}

@TestConfiguration
@ComponentScan(basePackages = {"package1","package1"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = SqsConfiguration.class)})
@Profile("test")
class SQLTestConfig {   

    @Bean
    public SomeBean beans() {

        return new SomeBean();
    }



}

Для загрузки этого класса конфигурации требуются учетные данные aws. Я не хочу вводить учетные данные для запуска простого тестового примера Bean.

org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «simpleMessageListenerContainer», определенным в ресурсе пути к классу [org/springframework/cloud/aws/messaging/config/annotation/SqsConfiguration.class]: не удалось вызвать метод инициализации; вложенным исключением является com.amazonaws.services.sqs.model.AmazonSQSException: срок действия токена безопасности, включенного в запрос, истек


person user91604    schedule 06.09.2019    source источник


Ответы (2)


Есть несколько способов исключить конкретную автоматическую настройку во время тестирования:

  • исключить через свойства в вашем application-test.properties
spring.autoconfigure.exclude=org.springframework.cloud.aws.messaging.config.annotation.SqsConfiguration
  • исключить через @TestPropertySource:
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest(classes = SQLTestConfig.class)
@TestPropertySource(properties ="spring.autoconfigure.exclude=org.springframework.cloud.aws.messaging.config.annotation.SqsConfiguration")

  • исключить через @EnableAutoConfiguration, например:
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest(classes = SQLTestConfig.class)
@EnableAutoConfiguration(exclude=SqsConfiguration.class)

Выбирайте тот, который вам больше подходит ;)

person Oleksii Zghurskyi    schedule 07.09.2019
comment
Я действительно пробовал все это. Я получил сообщение об ошибке. Следующий класс (SqsConfiguration) не является классом автоматической настройки для исключения. Не знаю, что делать. - person user91604; 08.09.2019
comment
@ user91604 Да, действительно. Я просто слепо предположил, что SqsConfiguration это автоконфигурация (facepalm). Проверил SqsConfiguration на github — оказывается для включения SQS используются 2 конфига — SqsClientConfiguration и SqsConfiguration. Попробуем исключить их обоих в excludeFilters ? - person Oleksii Zghurskyi; 09.09.2019
comment
@user91604 user91604 Также, если предложение с исключением не работает, давайте попробуем подход из здесь. Похоже, это распространенная проблема, и ребята придумали имитировать SQS для тестов. - person Oleksii Zghurskyi; 09.09.2019

Таким образом, чтобы отключить автоматическую загрузку всех Bean-компонентов для теста, тестовый класс может явно указать требуемые зависимости. Это можно сделать с помощью аннотации ContextConfiguration. например,

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {EmployeeService.class})
public class EmployeeLeavesTest { 

   @Autowired
   private EmployeeService employeeService;

}

Например, в этом случае будет доступен только класс EmployeeService, а другие компоненты не будут загружены.

person Isaac Philip    schedule 09.03.2021