@ConfigurationProperties не работают в тестах Spring Boot 2.4.2

У меня есть приложение, которое отлично работает в Spring Boot 2.3.8, но @RestClientTest не работает с 2.4.2, потому что тестовые объекты не могут быть созданы, потому что нет bean-компонента @ConfigurationProperties (который создается @TestConfiguration).

Как мне изменить свой код, чтобы он работал с 2.4.x?

Код:

@Configuration
@ConfigurationProperties(prefix = "tyntec.routetest.dsidr")
@Data
@Validated
public class DynamicSenderIdReplacementClientConfiguration {

  @NotBlank
  private String baseUrl;
  @NotBlank
  private String dsidrPath;
}

@Component
@RequiredArgsConstructor
public class DynamicSenderIdReplacementClient {

  private final DynamicSenderIdReplacementClientConfiguration configuration;
}

@ExtendWith(SpringExtension.class)
@RestClientTest(DynamicSenderIdReplacementClient.class)
@AutoConfigureWebClient(registerRestTemplate = true)
class DynamicSenderIdReplacementClientWebTest {

  @Autowired
  private DynamicSenderIdReplacementClient cut;

  @TestConfiguration
  static class testConfiguration {

    @Bean
    @Primary
    public DynamicSenderIdReplacementClientConfiguration provideConfig() {
      return new DynamicSenderIdReplacementClientConfiguration() {
        {
          setBaseUrl(BASE_URL);
          setDsidrPath(DSIDR_PATH);
        }
      };
    }
  }

Это работает в 2.3.8, но не работает в 2.4.2 с

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.tyntec.routetesting.client.itest.clients.DynamicSenderIdReplacementClientConfiguration' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Собирая вещи из приведенных выше фрагментов, ваш пример отлично работает для меня с Spring Boot 2.4.1 с bean-компонентом DynamicSenderIdReplacementClientConfiguration, определенным в testConfiguration, который вводится в DynamicSenderIdReplacementClient. Можете ли вы обновить свой вопрос полным и минимальным примером, который воспроизводит вашу проблему?

Andy Wilkinson 18.12.2020 14:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
926
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, @RestClientTest работает, как рекламируется, и подавляет бобы в @TestConfiguration:

Использование этой аннотации отключит полную автоматическую настройку и вместо этого применять только конфигурацию, относящуюся к тестам остальных клиентов (например, Джексон или автонастройка GSON и @JsonComponent bean-компоненты, но не обычные @Component фасоль).

Использование @Import помогает.

@RestClientTest(DynamicSenderIdReplacementClient.class)
@AutoConfigureWebClient(registerRestTemplate = true)
@Import(DynamicSenderIdReplacementClientWebTest.testConfiguration.class)
class DynamicSenderIdReplacementClientWebTest {

Другие вопросы по теме