web-dev-qa-db-ja.com

SpringBoot @ WebMvcTest、RestTemplateBuilderの自動配線

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に問題がありますか、それとも何かを見逃しましたか?

ありがとう

14
Alexandre

はい、これはバグのように感じます。
ただし、既存の@AutoConfigureWebClientとともにテストクラスに@WebMvcTestを追加することで、簡単に解決できます。

18
Patrick Herrera

コントローラーテストを作成するときは、通常、すべての共同作業者にモックを使用することを好みます。これにより、実際に呼び出しを実行しなくても、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);
   }
}
3
lane.maxwell

@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
Barath