Spring: как объединить @RestClientTest с RestTemplate с @Qualifier?

#java #spring #spring-boot #spring-boot-test #qualifiers

#java #весна #весенняя загрузка #spring-boot-test #квалификаторы

Вопрос:

Я изменил службу Spring Boot (2.1.4), которая использует a RestTemplate , на использование a @Qualifier . Теперь мой тест (с @RestClientTest и @AutoConfigureWebClient ) завершается неудачей, потому что он не может разрешить компонент.

Как мне это исправить?

Конфигурация:

   @Bean
  @Qualifier("eureka")
  @LoadBalanced
  RestTemplate eurekaRestTemplate() {
  

Служба:

   public ClarkClient(
      @Qualifier("eureka") RestTemplate restTemplate, ClarkConfiguration configuration)
      throws URISyntaxException {
  

Тест:

 @ExtendWith({SpringExtension.class, MockitoExtension.class})
@RestClientTest({CastorClient.class, CastorConfiguration.class})
@AutoConfigureWebClient(registerRestTemplate = true)
class CastorClientWebTest {

  @Autowired
  private CastorClient cut;

  @Autowired
  private MockRestServiceServer server;
  

Ошибка:

 [2019-04-16T14:02:22,614] [WARN ] [            ....AnnotationConfigApplicationContext] [refresh 557] : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'castorClient' defined in file [/home/martinsc/java/routing/route-testing-batch-manager/out/production/classes/com/tyntec/routetesting/batchmanager/core/clients/CastorClient.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=eureka)}
  

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

1. аннотировать CastorClientWebTest с помощью @SpringBootTest

2. @Deadpool Нет, это взрывается очень громко.

Ответ №1:

Вы не должны использовать (registerRestTemplate = true) , так как это создаст для вас компонент RestTemplate, который не является тем, который вы используете.

Если ваш квалифицированный компонент RestTemplate объявлен в вашем CastorConfiguration , попробуйте использовать @Import(CastorConfiguration.class)

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

1. Нет. Класс config RestTemplateConfig и простой импорт этого не помогают. Как мне объявить свой собственный RestTemplate для использования @RestClientTest ? У меня уже есть @TestConfiguration класс в тестовом классе.

Ответ №2:

Решение, которое сработало для меня: @AutoConfigureWebClient (без (registerRestTemplate = true) ). В @TestConfiguration классе создайте компонент RestTemplate с правильным @Qualifier

 @Bean
@Qualifier("eureka")
public RestTemplate eurekaRestTemplate() {
  return new RestTemplate();
}
  

Внедрите это в тестовый класс

 @Autowired
@Qualifier("eureka")
private RestTemplate restTemplate;
  

Теперь нам нужно подключить это к MockRestServiceServer . Мы делаем это через @BeforeEach

 private MockRestServiceServer server;
@BeforeEach
  void setUp () {
    server = MockRestServiceServer.bindTo(restTemplate).build();
  }