#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();
}