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
.