【问题标题】:Spring-Boot 2.3.0.RELEASE Unable to autowire RestTemplate for JUnit 5 testSpring-Boot 2.3.0.RELEASE 无法为 JUnit 5 测试自动装配 RestTemplate
【发布时间】:2020-06-08 08:12:40
【问题描述】:

我已在@Configuration 类中配置了必要的 Bean,但无法将 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();
    }
}

感谢任何建议和见解

【问题讨论】:

  • @ActiveProfiles("dev") 似乎有问题,“dev”配置文件是否处于活动状态?
  • 删除@ExtendWith,已经隐含在@SpringBootTest 中,并从@SpringBootTest 类中删除classes。此外,模板不应该是null,而是你的测试应该爆炸。
  • 是的,“dev”是 pom.xml 中定义的默认活动配置文件。添加-Pdev 没有帮助。
  • 尝试了@M.Deinum 的建议,但不起作用。

标签: spring-boot autowired junit5 spring-boot-test spring-resttemplate


【解决方案1】:

注解@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, classes = {RestTemplate.class, ProtobufHttpMessageConverter.class}) 的classes 属性采用组件类来加载应用程序上下文。除了主 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();
    }
}

这现在应该在 dev 配置文件中启动您的整个 Spring Boot 上下文,并且您应该可以访问您在生产代码中定义的所有 bean,例如 AppConfig。

【讨论】:

  • 不起作用是什么意思?您能否为您的问题添加完整的堆栈跟踪。也许根本原因在其他地方
  • 什么堆栈跟踪?没有崩溃。 assertNotNull(restTemplate, "autowired restTemplate is NULL!"); 失败。
  • 你可以尝试注入TestRestTemplate吗?如果您想在测试期间访问您的应用程序,如果您启动整个 Spring 上下文和嵌入式 servlet 容器,则会为您自动配置
  • 这个缺失的符号要包含哪个包?它会注入我现有的RestTemplate bean 吗?
  • 刚刚测试过。我只将@Autowired 从RestTemplate 更改为TestRestTemplate,但没有帮助。仍然为 NULL。
猜你喜欢
  • 2020-02-09
  • 2018-09-17
  • 2021-09-05
  • 2021-12-23
  • 2022-01-07
  • 2017-02-25
  • 2019-07-01
  • 2014-03-11
  • 2020-03-24
相关资源
最近更新 更多