2017-01-16 40 views
4

我在测试Spring Controller时遇到了问题。 我在我的测试类中使用了注解@WebMvcTest。 当我运行测试,我得到这个错误: 型“org.springframework.boot.web.client.RestTemplateBuilder”可用SpringBoot @WebMvcTest,自动装配RestTemplateBuilder

我使用RestTemplate其他类在我的项目,所以我没有合格的豆已经在我的主类中定义一个bean:

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

为了使它的工作,我必须这样定义我restTemplate豆:

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

是否与标注@WebMvcTest有问题还是我想念什么?

感谢

+0

一起加入到@AutoConfigureWebClient测试类很容易地解决它只是跳进了同一个问题,它看起来像我的错误,并不能找到太多goggling左右。你有任何更新? – Paizo

回答

0

当你添加任何参数来定义@Bean这意味着你正在寻找对于T提到要注入类型的豆。 改变这样的:当我在写我的控制器测试

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

@Bean 
    public RestTemplate restTemplate() { 

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

     return builder.build(); 
    } 
+0

好了,但是相应的Spring文档,Spring-Boot提供了一个RestTemplateBuilder bean,这就是为什么我不应该创建另一个 - > https://spring.io/guides/gs/consuming-rest/。除了当我启动我的应用程序时一切正常,它只在单元测试中... – Alexandre

1

,我一般喜欢用嘲笑为所有合作者。这使得使用您期望的值验证您的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); 
    } 
} 
+0

但我正在测试的控制器不使用RestTemplate。如果我在我的测试类中创建一个MockBean,它的工作原理如下: @MockBean private RestTemplateBuilder restTemplateBuilder; 但是这个mockBean没有被使用,它是避免这个错误的解决方法,但它在我的测试类中添加了无用的属性... – Alexandre

5

是的,这感觉就像一个错误。
然而,你可以通过与现有@WebMvcTest

+0

这个解决方案为我解决了这个问题。当我们尝试使用测试片时,感觉就像我们正在进入无证的领域。 Spring在测试过程中为我们创建了一些豆子,但是有些 - 比如RestTemplateBuilder - 除非我们按照你的建议撒上这种魔术仙尘,否则它们是神秘的。 – Gary

+0

我同意@加里,我为此提出了一个问题(https://github.com/spring-projects/spring-boot/issues/8784),但它被封闭为https://github.com/spring-项目/弹簧启动/问题/ 7999。 –

+0

但是我已经改变了我对这个bug的看法,我认为这只是一个例子,说明测试片可以让你自动装配,并且你不应该对任何可用bean做出任何假设使用切片功能。 感觉就像一个错误,因为RestTemplate似乎与测试MVC同时进行,但问自己在测试中是否真的使用了RestTemplate?您可能需要根据测试期间扫描的内容来重构应用程序。 –