2016.8.15

2615 ワード

今日は主にspring bootのテスト問題について研究します.一般的なテストについては公式サイトで詳しく説明されていますが、controllerをテストすると、一連の問題に遭遇します.

コントローラテストでは何を考慮する必要がありますか?


1.requestリクエストを送信します.2.受け取ったreponseを判断する.この簡単な2つのステップについて、問題と解決策は次のように解決されます.

質問1:


コントロールをテストするときは、springbootでどのようにウェブサービスを使用するかというウェブサービスが必要です.

ソリューション:


springbootTestを使用すると、springコンテナ全体がロードされるとともに、spring bootに埋め込まれたウェブサービスであるwebEnvironmentというウェブEnvironmentがロードされます.springbootTestでポートを指定して有効にすれば、controller.をテストすることができます.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)// , command+b 
public class BookControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;
    @Test
    public void testHome(){
        // url 
        String content = restTemplate.getForObject("/book/home", String.class);
        Assert.assertEquals("bookhome", content);
    }

ポート指定は次のとおりです.
  MOCK(false),
  RANDOM_PORT(true), // , 
  DEFINED_PORT(true), // 
  NONE(false);

質問2:WebサービスをMockでテストできるかどうかcontroller.


解決する


以前mock関連のテストツールを使用したことがあるので、webに対してMockを行うことができるかどうかを考えて、spring bootはWebMvcTestの注釈を提供して、この注釈を使用する時、どのcontroller.をテストする必要があるかを指定しなければなりません.
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
public class BookControllerTest2 {
    @Autowired
    private MockMvc mvc;
    @Test
    public void testHome() throws Exception{
        // 200 
        mvc.perform(MockMvcRequestBuilders.get("/book/home"))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }

注意:この方法を使用すると、controllerで外部の依存クラスを使用すると、エラーが発生するという問題があります.WebMvcTestのソースコードを表示することで、WebMvcTestはspringコンテナ全体をロードせずにcontrollerのみをテストすると明記されています.外部の依存を使用すると、エラーが発生します.このとき、私の最初の反応は、WebMvcTestとspringBootTestの2つの注釈を結合すれば間違いなくいいということです.テストでは、この2つの注釈は一緒に使用できず、直接実行できないことがわかりました.最後に、ソースコードの注釈にAutoConfigureMockMvc注釈と組み合わせて使用する必要がある場合は、外部の依存クラスを使用することができます.
@RunWith(SpringRunner.class)
@SpringBootTest
//@WebMvcTest
@AutoConfigureMockMvc
public class BookControllerTest3 {
    @Autowired
    private MockMvc mvc;
    @Test
    public void testHome() throws Exception{
        // 200 
        mvc.perform(MockMvcRequestBuilders.get("/book/home"))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }

まとめ


前に問題があったとき、最初の反応はgoogleでした.実は时には、ソースコードには玄机が隠されていて、注釈にははっきりした说明があるので、试してみてください.また、テストについては、テストをどのように実現するかではなく、どのように設計されたテスト用例を感じ、coverの全面的な機能とシーンを行うことが最も重要です.