详解Spring MVC如何测试Controller(使用springmvc mock测试)
在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、卸载测试环境 参考: spring-mvc-test-framework 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java RegEx:拆分而不丢失令牌
- java – 从运行JVM导出数据?
- selenium – junit.framework.AssertionFailedError:在寄存
- Java往返String – > float – > String甚至(某些
- java – 如何在FreeMarker中传递String作为输入?
- java – 当用作方法签名时,T意味着什么?它是一种返回类型吗
- java.util.concurrent.ExecutionException:java.lang.OutO
- Java中集合关系图及常见操作详解
- 在java中解析CSV文件,并使用空值进行delaing
- 如何在Java中的自定义异常中设置我自己的消息,可以检索我的