Модульный тест Springboot 3 resttemplate, как вводить

мой 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();
    }
}

Спасибо Даниэле

:

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку вы «только» @SpringBootTest(classes = PosteDeliveryClientImpl.class) (загружаете отдельные классы/пакеты в контекст весеннего теста), конфигурация RestTemplate (автоматическая/настраиваемая), похоже, не подхватывается.

Возможные решения:

  1. Импортируйте/повторно используйте конфигурацию RestTemplate (авто/пользовательскую):

    • через @SpringBootTest#classes
    • любым другим возможным/разумным способом...

    ((конструктор!) автоконфигурация (в настоящее время) в org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration ;)

  2. Настройте новый:

    • настоящий (на основе пользовательской/автоматической конфигурации)
    • мнимый...

Решено удалением классов = PosteDeliveryClientImpl.class в аннотации @SpringBootTest, как было предложено. Спасибо

PifTheWolf 02.04.2023 19:56

добро пожаловать! правильно, это решение «кувалда», но вы платите за это «полным контекстом» (тест). Более умное/тонкое решение: выборочно импортировать/декларировать его (компонент restTermplate(builder)).

xerx593 02.04.2023 20:00

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