SpringBoot+MockMvcテストControllerノート整理

3653 ワード

基本フレームワーク:Springboot(バージョン情報:1.5.6.RELEASE)
環境情報:JDK 1.8
テストjarパッケージ:spring-boot-starter-test
以前他のプロジェクトでMockを用いたユニットテストを見たことがありますが、SpringMvc環境ではControllerに要求されたテストを直接シミュレートすることができ、よく使われるSping JunitやSpring TestNGなどよりも参考になる点があります.
本編では関連資料と結びつけてMockテストを行い、基本手順や注意点、分からない点についてメモをとり、後続の項目で出会ったら理解を深めることができます.
一、基本的なSpringBoot環境を構築した後、基本的に必要なjarパッケージを含み、テストクラスは直接生成したsrc/main/testディレクトリの下で新規作成することができる.
二、テスト例:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class TestUserContorller {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testGetUser() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/test/getUser.json").param("realName", "zhangsan")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();
    }
}

説明1:Spring 4.バージョン2以降、@SpringBootTest注記を元の注記に置き換えました.SpringMvcではxmlスキャンを構成してbeanを構築します.SpringBootでは起動クラスを構成するとすべてのbeanを構築できます.もちろん、この場所では使用するbeanのみを構成することもできます.
説明2:上記の方法は、すべてのControllerをテストする場合に適用する、一般的に単一のControllerをテストする場合に@SpringBootTest(classes={MockServiceServiceContext.class})を使用することを推奨し、MockMvcを構築する際にmockMvc=MockMvcBuildersを使用する.standaloneSetup(new UserController()).build(); 残りは、テストを要求するメソッドでサービスbeanを参照しない場合は可能ですが、サービスメソッド呼び出しに関連するメソッドではNullPonitException異常(@AutoWired注入beanは初期化されていません)が投げ出され、まだ解決策は見つかっていませんが、解決策もあると信じています
附1:単一コントローラテストの完全な例
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {MockServletContext.class})
public class TestSimpleController {

    private MockMvc mockMvc;

    @Before
    public void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
    }

    @Test
    public void testGetUser() throws Exception {
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/test/kidding.json")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andDo(MockMvcResultHandlers.print())
            .andReturn();
        System.out.println(result.getResponse().toString());
    }
}

附2:Mockテスト単一コントローラ
public class TestSimpleController {

    /**
     *  Mock 
     * Controller 
     */
    @InjectMocks
    private UserController userController;

    /**
     *  Mock 
     * Controller bean
     */
    @Mock
    private UserService userService;

    private MockMvc mockMvc;

    /**
     *  , mvc web 
     */
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }

    @Test
    public void testGetUser() throws Exception {
        User user = new User();
        Mockito.when(userService.getUserByRealName("zhangsan")).thenReturn(user);
        Assert.assertNotNull(user);

        this.mockMvc.perform(MockMvcRequestBuilders.get("/test/getUser.json").param("realName", "zhangsan")
            .accept(MediaType.APPLICATION_JSON))
            .andDo(MockMvcResultHandlers.print())
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andReturn();
    }

説明:テスト中にシミュレーションリクエストおよびパラメータが正しいことがわかりましたが、サービスレイヤのdaoレイヤのリファレンス呼び出しは実行されませんが、エラーは報告されません.