Spring Controller单元测试

时间:2023-12-29 18:24:38

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);
}
}