详解SpringMVC如何测试Controller(使用springmvcmock测试)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解SpringMVC如何测试Controller(使⽤
springmvcmock测试)
在springmvc中⼀般的测试⽤例都是测试service层,今天我来演⽰下如何使⽤springmvc mock直接测试controller层代码。

1.什么是mock测试?
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,⽤⼀个虚拟的对象来创建以便测试的测试⽅法。

2.为什么要使⽤mock测试?
使⽤Mock O bject进⾏测试,主要是⽤来模拟那些在应⽤中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者⽐较复杂的对象(如JDBC中的ResultSet对象)从⽽使测试顺利进⾏的⼯具。

3.常⽤注解
RunWith(SpringJUnit4ClassRunner.class): 表⽰使⽤Spring Test组件进⾏单元测试;
WebAppConfiguratio: 使⽤这个annotation会在跑单元测试的时候真实的启⼀个web服务,然后开始调⽤Controller的Rest API,待单元测试跑完之后再将web服务停掉;
ContextConfiguration: 指定Bean的配置⽂件信息,可以有多种⽅式,这个例⼦使⽤的是⽂件路径形式,如果有多个配置⽂件,可以将括号中的信息配置为⼀个字符串数组来表⽰;
4.安装测试环境
spring mvc测试框架提供了两种⽅式,独⽴安装和集成Web环境测试(此种⽅式并不会集成真正的web环境,⽽是通过相应的Mock API进⾏模拟测试,⽆须启动服务器)。

独⽴安装测试⽅式
MockMvcBuilders.standaloneSetup(Object... controllers):通过参数指定⼀组控制器,这样就不需要从上下⽂获取了;
主要是两个步骤:
(1)⾸先⾃⼰创建相应的控制器,注⼊相应的依赖
(2)通过MockMvcBuilders.standaloneSetup模拟⼀个Mvc测试环境,通过build得到⼀个MockMvc
代码如下:
package com.xfs.test;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
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.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xfs.web.controller.APIController;
/**
* 独⽴安装测试⽅式 springmvc mock测试
*
* @author admin
*
* 2017年11⽉23⽇上午10:39:49
*/
public class TestApiOne {
private MockMvc mockMvc;
@Before
public void setUp() {
APIController apiController = new APIController();
mockMvc = MockMvcBuilders.standaloneSetup(apiController).build();
}
@Test
public void testGetSequence() {
try {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))
.andExpect(MockMvcResultMatchers.status().is(200))
.andDo(MockMvcResultHandlers.print())
.andReturn();
int status = mvcResult.getResponse().getStatus();
System.out.println("请求状态码:" + status);
String result = mvcResult.getResponse().getContentAsString();
System.out.println("接⼝返回结果:" + result);
JSONObject resultObj = JSON.parseObject(result);
// 判断接⼝返回json中success字段是否为true
Assert.assertTrue(resultObj.getBooleanValue("success"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
请求结果如下:
集成Web环境⽅式
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下⽂获取相应的控制器并得到相应的MockMvc;
主要是三个步骤:
(1)@WebAppConfiguration:测试环境使⽤,⽤来表⽰测试环境使⽤的ApplicationContext将是WebApplicationContext类型
的;value指定web应⽤的根
(2)通过@Autowired WebApplicationContext wac:注⼊web环境的ApplicationContext容器
(3)然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建⼀个MockMvc进⾏测试代码如下:
package com.xfs.test;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
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.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
* 集成Web环境⽅式 springmvc mock测试
*
* @author admin
*
* 2017年11⽉23⽇上午11:12:43
*/
@RunWith(JUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath*:spring/*.xml" })
public class TestApiTwo extends AbstractJUnit4SpringContextTests {
@Autowired
public WebApplicationContext wac;
public MockMvc mockMvc;
public MockHttpSession session;
@Before
public void before() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void testGetSequence() {
try {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/api/getSequence"))
.andExpect(MockMvcResultMatchers.status().is(200))
.andDo(MockMvcResultHandlers.print())
.andReturn();
int status = mvcResult.getResponse().getStatus();
System.out.println("请求状态码:" + status);
String result = mvcResult.getResponse().getContentAsString();
System.out.println("接⼝返回结果:" + result);
JSONObject resultObj = JSON.parseObject(result);
// 判断接⼝返回json中success字段是否为true
Assert.assertTrue(resultObj.getBooleanValue("success"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运⾏结果和上⾯独⽴测试时候⼀样。

总结:
整个过程:
1、mockMvc.perform执⾏⼀个请求;
2、MockMvcRequestBuilders.get("/user/1")构造⼀个请求
3、ResultActions.andExpect添加执⾏完成后的断⾔
4、ResultActions.andDo添加⼀个结果处理器,表⽰要对结果做点什么事情,⽐如此处使⽤MockMvcResultHandlers.print()输出整个响应结果信息。

5、ResultActions.andReturn表⽰执⾏完成后返回相应的结果。

整个测试过程⾮常有规律:
1、准备测试环境
2、通过MockMvc执⾏请求
3、添加验证断⾔
4、添加结果处理器
5、得到MvcResult进⾏⾃定义断⾔/进⾏下⼀步的异步请求
6、卸载测试环境
参考:
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

相关文档
最新文档