мой env весенняя загрузка 3.0.5:
Мне нужно реализовать тест uinit для метода службы login(), который использует шаблон отдыха
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = PosteDeliveryClientImpl.class)
public class DeliveryBusinessClientTests {
@Autowired
private PosteDeliveryClientImpl posteDeliveryClient;
public DeliveryBusinessClientTests() {
}
@Test
public void login() {
var loginResponse = posteDeliveryClient.login();
assertEquals("Bearer", loginResponse.getToken_type());
}
Сервис определен ниже:
@Service
public class PosteDeliveryClientImpl implements PosteDeliveryClient {
@Autowired
private RestTemplate restTemplate;
.....
...
@Override
public LoginResponse login() {
var loginRequest = new LoginRequest("xxxxxxxxxx",
"xxxxxxxx",
"api://xxxxxxxxxx/.default",
"client_credentials");
ResponseEntity<LoginResponse> response = restTemplate.postForEntity(ROOT_URI, loginRequest, LoginResponse.class);
return response.getBody();
}
Когда я запускаю тест, я получаю:
Для поля restTemplate в it.posweb.service.pti.PosteDeliveryClientImpl требуется bean-компонент типа org.springframework.web.client.RestTemplate, который не может быть найден.
Действие:
Рассмотрите возможность определения bean-компонента типа org.springframework.web.client.RestTemplate в вашей конфигурации.
Как правильно решать инъекцию?
Я пытаюсь добавить bean-компонент в класс конфигурации, но инъекция не работает:
@Configuration
public class RestTemplateConfig extends RestTemplate {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder();
}
}
Спасибо Даниэле
:
Поскольку вы «только» @SpringBootTest(classes = PosteDeliveryClientImpl.class)
(загружаете отдельные классы/пакеты в контекст весеннего теста), конфигурация RestTemplate
(автоматическая/настраиваемая), похоже, не подхватывается.
Возможные решения:
Импортируйте/повторно используйте конфигурацию RestTemplate
(авто/пользовательскую):
@SpringBootTest#classes
((конструктор!) автоконфигурация (в настоящее время) в org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
;)
Настройте новый:
добро пожаловать! правильно, это решение «кувалда», но вы платите за это «полным контекстом» (тест). Более умное/тонкое решение: выборочно импортировать/декларировать его (компонент restTermplate(builder)).
Решено удалением классов = PosteDeliveryClientImpl.class в аннотации @SpringBootTest, как было предложено. Спасибо