Spring Ошибка загрузки @Autowired RestTemplateBuilder с junit

Попытка @Autowired RestTemplate в Spring Boot 2.1.4 с использованием RestTemplateBuilder. Когда я запускаю тесты junit, я получаю сообщение об ошибке при попытке автоматического подключения RestTemplate.

Я видел здесь: Как автоматически связать RestTemplate с помощью аннотаций Кажется, что RestTemplateBuilder лучше, поэтому я хотел бы использовать его.

Это файл конфигурации:

@Configuration
public class Beans {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

Это тестовый класс:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = Beans.class)
public class AppTest extends TestCase {
    @Autowired
    private RestTemplate restTemplate;
}

Ошибка:

APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method restTemplate in beanDeclerations.Beans required a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.boot.web.client.RestTemplateBuilder' in your configuration.

Я отредактировал другие автомонтажные работы. Что мне здесь не хватает? После поиска в Интернете я обнаружил, что Spring автоматически подключил RestTemplateBuilder, почему здесь этого нет?

Обновлено: В итоге я использовал @RestClientTest(), и на данный момент мне пришлось переместить RestTemplateBuilder Bean в основной класс, позже я перенесу его в другое место. Спасибо за помощь.

Привет, я думаю, что RestTemplateBuilder не настроен в вашем приложении. Вы можете проверить baeldung.com/spring-rest-template-builder по этой ссылке, чтобы узнать, как настроить RestTemplate с помощью RestTemplateBuilder. Надеюсь, поможет.

vatsal gosar 06.07.2019 17:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
6 356
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

RestTemplateBuilder должен быть доступен через автоконфигурацию (см.: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/client/ RestTemplateAutoConfiguration.java). Я думаю, что эта конфигурация отсутствует из-за вашего @ContextConfiguration. У вас есть некоторые возможности. Попробуйте добавить AutoConfig для RestTemplateBuilder в свой ContextConfiguration. Второй — сделать TestConfiguration и создать свой собственный RestTemplateBuilder или непосредственно RestTemplate. Третий - не внедряйте RestTemplate - создайте его вручную в своем тесте. Вы также можете удалить аннотацию @ContextConfiguration-Annotation, но это приведет к тесту, который загружает каждую конфигурацию, которую вы определили в своем проекте.

Также существует RestTestTemplate (https://www.baeldung.com/spring-boot-testresttemplate), предназначенный для тестов.

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = {TestConfig.class, RestTemplateAutoConfiguration.class})
public class SandboxApplicationTests {

    @Autowired
    RestTemplate restTemplate;

    @Test
    public void contextLoads() {
    }

}

Фрагмент выше работает для меня. Без RestTemplateAutoConfiguration в ContextConfiguration RestTemplate не может быть создан из-за отсутствия RestTemplateBuilder-Bean

У меня была такая же проблема (в приложении Spring Boot 2.5.5).

Чтобы решить эту проблему, мне пришлось добавить @AutoConfigureWebClient в свой тестовый класс.

Итак, мой тест выглядит так:

@AutoConfigureWebClient
@WebMvcTest(controllers = TeamController.class)
public class TeamControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private FooService fooService;

    @Test
    public void findAllFoos() throws Exception {
        mockMvc.perform(get("/foos"))
                .andExpect(status().isOk());
    }
}

Но я где-то читал, что это может рассматриваться как ошибка, которую должна исправить Spring Team (может быть, эта аннотация будет напрямую добавлена ​​в @WebMvcTest?).

Я думаю так: тест запускается и останавливается быстрее, чем когда вы используете @SpringBootTest (потому что последний полностью запускает ваше приложение).

Для получения дополнительной информации: https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/client/AutoConfigureWebClient.html

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