2017-06-30 6 views
2

私はSpring MVC @RestControllerをテストしています。これは外部RESTサービスを呼び出します。私は春の環境をシミュレートするのにMockMvcを使用しますが、私のコントローラーが外部サービスへの実際の呼び出しを行うことを期待しています。 RestControllerを手動でテストすると、Postmanなどでうまく動作します。コンテンツとヘッダが空であるため、スプリングMockMvcは2つのわずかに異なるアプローチのうちの1つで空のコンテンツを返す

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = AnywhereController.class) 
public class AnywhereControllerTest{ 

    @Autowired 
    private AnywhereController ac; 

    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
    } 

    @Test 
    public void testGetLocations() throws Exception { 

     ... 

     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/anywhere/locations").accept(MediaType.APPLICATION_JSON)) 
       .andExpect(status().isOk()) 
       .andExpect(content().string(containsString("locations"))) 
       .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)); 
     .andReturn(); 
    } 

テストが失敗した:

私は私のセットアップが特定の方法でのテストは、私は(ステータス・コードを除く)完全に空の応答を取得する場合ことがわかりました。

@Configuration 
@EnableWebMvc 
public static class TestConfiguration{ 
    @Bean 
    public AnywhereController anywhereController(){ 
     return new AnywhereController(); 
    } 
} 

、さらに私はContextConfiguration注釈(私はこれが実際に何を知りたいのですが)変更:それから私は、テストクラスにこれを追加しようとした

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration 
public class AnywhereControllerTest{...} 

今、突然すべてのチェックを成功し、コンテンツ本文を印刷するときにすべてのコンテンツを取得しています。

ここで何が起こっているかこれら2つのアプローチの違いは何ですか?

+0

違いは、 '@ EnableWebMvc'によって登録されたすべてのBeanです。 –

+0

もう少し説明できますか? – Shady

答えて

1

コメントの誰かが@EnableWebMvcに言及しており、これが正しいリードであることが判明しました。 私は@EnableWebMvcを使用していませんでしたし、このアノテーションを使用しない場合は、したがって

は、あなたが最初にコンテンツタイプのような違いが、物事に気づくと、ヘッダーを受け入れていない可能性があり、一般的にコンテンツネゴシエーションは動作しません。 Source

フレームワークの内部動作についての知識は限られていますが、起動時には簡単な警告が表示されるため、多くの時間のデバッグが行われる可能性があります。人々が@Configurationや@RestControllerを使うときに@EnableWebMvc(またはそのxmlバージョン)を使いたいという人が多いでしょう。

さらに悪いことに、Spring Bootはこのアノテーションを自動的に追加します。そのため、インターネット上の多くのチュートリアル(公式のチュートリアルも)は@EnableWebMvcについて言及していません。