SpringControllerのテスト中に問題が発生しました。テストクラスでアノテーション@WebMvcTestを使用しています。テストを実行すると、次のエラーが発生します。タイプ 'org.springframework.boot.web.client.RestTemplateBuilder'の修飾Beanが利用できません
プロジェクトの他のクラスにRestTemplateを使用しているので、メインクラスでBeanを定義しました。
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
それを機能させるには、restTemplateBeanを次のように定義する必要があります。
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
アノテーション@WebMvcTestに問題がありますか、それとも何かを見逃しましたか?
ありがとう
はい、これはバグのように感じます。
ただし、既存の@AutoConfigureWebClient
とともにテストクラスに@WebMvcTest
を追加することで、簡単に解決できます。
コントローラーテストを作成するときは、通常、すべての共同作業者にモックを使用することを好みます。これにより、実際に呼び出しを実行しなくても、Beanが期待する値で呼び出されていることを非常に簡単に確認できます。
WebMvcTestを使用すると、これを簡単に実行できます。以下は、RestTemplateBeanを指定した例です。
@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);
}
}
@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();
}