Spring-Boot 2.3.0.RELEASE Невозможно автоматически подключить RestTemplate для теста JUnit 5

Я настроил необходимые Beans в @Configuration class, но мне не удалось внедрить RestTemplate в мой тестовый класс для тестирования.

@Configuration
public class AppConfig {
    @Bean
    public ProtobufHttpMessageConverter protobufHttpMessageConverter() {
        return new ProtobufHttpMessageConverter();
    }
    @Bean
    public RestTemplate restTemplate(ProtobufHttpMessageConverter converter) {
        RestTemplate http2Template = new RestTemplate(new OkHttp3ClientHttpRequestFactory());
        List<HttpMessageConverter<?>> converters = http2Template.getMessageConverters();
        converters.add(converter);
        http2Template.setMessageConverters(converters);
        return http2Template;
    }
}

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

@ExtendWith(SpringExtension.class)
@AutoConfigureWebClient(registerRestTemplate = true)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, classes = {RestTemplate.class, ProtobufHttpMessageConverter.class})
@ActiveProfiles("dev")
public class GRPCRestApiTest {
    @Autowired
    private RestTemplate restTemplate;
    @Test
    public void GetOneCourseUsingRestTemplate() throws IOException {
        assertNotNull(restTemplate, "autowired restTemplate is NULL!");
        ResponseEntity<Course> course = restTemplate.getForEntity(COURSE_URL, Course.class);
        assertResponse(course.toString());
        HttpHeaders headers = course.getHeaders();
    }
}

Любые советы и идеи приветствуются

1 ответ

В classes атрибут аннотации @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, classes = {RestTemplate.class, ProtobufHttpMessageConverter.class})принимает классы компонентов для загрузки контекста приложения. Вы не должны помещать сюда ничего, кроме вашего основного класса Spring Boot, или оставлять его пустым.

более того @AutoConfigureWebClient(registerRestTemplate = true) поскольку вы хотите использовать bean-компонент, который вы настраиваете внутри своего приложения (по крайней мере, это то, что я понял из вашего вопроса).

Итак, ваша тестовая установка должна выглядеть следующим образом:

// @ExtendWith(SpringExtension.class) can be omitted as it is already part of @SpringBootTest
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("dev")
public class GRPCRestApiTest {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    public void GetOneCourseUsingRestTemplate() throws IOException {
        assertNotNull(restTemplate, "autowired restTemplate is NULL!");
        ResponseEntity<Course> course = restTemplate.getForEntity(COURSE_URL, Course.class);
        assertResponse(course.toString());
        HttpHeaders headers = course.getHeaders();
    }
}

Теперь это должно запустить весь ваш контекст Spring Boot в dev profile, и у вас должен быть доступ ко всем вашим bean-компонентам, которые вы определяете в своем производственном коде, например AppConfig.

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