SpringBoot @WebMvcTest,自动装配RestTemplateBuilder

时间:2017-01-16 09:43:11

标签: java spring spring-boot junit resttemplate

我在测试Spring Controller时遇到了问题。 我在我的测试类中使用了注释@WebMvcTest。 当我运行测试时,我收到此错误: 没有符合条件的bean' org.springframework.boot.web.client.RestTemplateBuilder'可用

我在我的项目中使用RestTemplate用于其他类,所以我在主类中定义了一个bean:

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

为了使它工作,我必须以这种方式定义我的restTemplate bean:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

注释@WebMvcTest是问题还是我错过了什么?

由于

3 个答案:

答案 0 :(得分:12)

是的,这确实感觉像是一个错误 但是,您可以通过将@AutoConfigureWebClient与现有@WebMvcTest

一起添加到测试类中来轻松解决问题

答案 1 :(得分:2)

当你向@Bean定义添加任何参数时,这意味着你正在寻找一个被注入的类型为T的bean。 改变这个:

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

 @Bean
    public RestTemplate restTemplate() {

       RestTemplateBuilder builder=new RestTemplateBuilder(//pass customizers);

        return builder.build();
    }

答案 2 :(得分:2)

当我编写Controller测试时,我通常更喜欢为所有协作者使用模拟。这样就可以非常轻松地验证您的bean是否使用您期望的值进行调用,而无需实际执行调用。

使用WebMvcTest,这非常容易实现,下面是给出RestTemplate Bean的示例。

@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {

   @MockBean
   private RestTemplate restTemplate;

   @Test
   public void get_WithData() {
      mockMvc.perform(get("/something")).andExpect(status().isOk());
      verify(restTemplate, times(1)).getForObject("http://localhost:8080/something", SomeClass.class);
   }
}