Spring Controller單元測試


SpringMVC controller測試較簡單,從功能角度划分,可分為兩種。一種是調用請求路徑測試,另一種是直接調用Controller方法測試。

調用請求路徑測試

通過請求路徑調用,請求需要經過攔截器,再到對應的Controller方法處理

被測試代碼示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/api")
public class MembersController {

    @Autowired
    private MembersService membersService;

    @RequestMapping(value = "/user", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String getUser(HttpServletRequest request, @RequestBody String str,
                         @RequestParam(value = "userId") String userId) {
        Members result = membersService.getMemberById(Integer.valueOf(userId));
        return result.toString();
    }
}

測試代碼示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)     //調用Spring單元測試類
@WebAppConfiguration        //調用Java Web組件,如自動注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"})      //加載Spring配置文件
public class MembersControllerTest2 {

    @Autowired
    protected WebApplicationContext wac;

    @Mock
    private MembersService service;

    @InjectMocks
    private MembersController controller;       //需要測試的Controller

    private MockMvc mockMvc;        //SpringMVC提供的Controller測試類

    private String url;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(wac).build();
    }

    @Test
    public void testGetUser() throws Exception {
        url = "the URL to Controller";

        Members m = new Members(3, "wangwu", 1, 5, "12131232342");
        when(service.getMemberById(Mockito.anyInt())).thenReturn(m);

        MvcResult result = mockMvc
                .perform(MockMvcRequestBuilders.post(url)
                        .accept(MediaType.APPLICATION_JSON)
                        .param("userId", "3"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attributeExists("name"))
                .andReturn();
        assertEquals(m.toString(), result.getModelAndView().getModel().get("user").toString());
    }
}

調用Controller方法測試

無法對攔截器和URL路徑配置進行測試。測試方法類似於service層單元測試,可以對依賴的service層進行mock。可以參考spring service層單元測試一文

被測試代碼示例

測試代碼同調用請求路徑測試方式部分一樣

測試代碼示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

@RunWith(SpringJUnit4ClassRunner.class)     //調用Spring單元測試類
@WebAppConfiguration        //調用Java Web組件,如自動注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"})      //加載Spring配置文件
public class MembersControllerTest {
    @Mock
    private MembersService service;

    @InjectMocks
    private MembersController controller;       //需要測試的Controller
    private MockHttpServletRequest request;

    private MockMvc mockMvc;        //SpringMVC提供的Controller測試類

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        request = new MockHttpServletRequest();
    }

    @Test
    public void testGetUser() throws Exception {
        request.addParameter("userId", "100100");

//      request.addParameter("id", "101010");       //如果需要從request取數據,可以在request中添加parameter

        Members m = new Members(3, "wangwu", 1, 5, "12131232342");
        when(service.getMemberById(Mockito.anyInt())).thenReturn(m);

        String response = new String();
        String result = controller.getUser(request, response, "3");
        assertEquals(m.toString(), result);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM