2017-01-16 81 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?您可能需要根據測試期間掃描的內容來重構應用程序。 –