Spring整合MockMvc单元测试,Java配置
来源:互联网 发布:照片打印软件免费版 编辑:程序博客网 时间:2024/06/03 18:28
Spring整合MockMvc进行单元测试,首先添加Spring-Test maven依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.7.RELEASE</version></dependency>
Java配置如下:
package com.bob.test.config;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.UnsupportedEncodingException;import com.bob.config.mvc.model.User;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import org.junit.Before;import org.junit.runner.RunWith;import org.springframework.aop.support.AopUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.MediaType;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.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.util.Assert;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.context.WebApplicationContext;import com.bob.config.mvc.MvcContextConfig;import com.bob.config.mvc.exception.CustomizedException;import com.bob.config.root.RootContextConfig;import com.google.gson.Gson;/** * @since 2016年12月8日 下午4:45:26 * @author * */@WebAppConfiguration@RunWith(SpringJUnit4ClassRunner.class) //ContextConfiguration可以指定Java配置类,或者是配置文件,这里是基于Java配置形式@ContextConfiguration(classes = { RootContextConfig.class, MvcContextConfig.class })public abstract class BaseControllerTest { protected Gson gson; private MockMvc mockMvc; protected MockHttpSession session; protected Object mappedController; protected String userName; protected String password; protected boolean loginBefore; @Autowired protected WebApplicationContext webApplicationContext; @Before() public void setup() { gson = new Gson(); // 初始化MockMvc对象 mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); init(); } /** * @param urlTemplate * @param urlVariables * @return */ public String getRequest(String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.GET, null, false, null, urlTemplate, urlVariables); } /** * @param urlTemplate * @param urlVariables * @return */ public String getAsyncRequest(String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.GET, null, true, null, urlTemplate, urlVariables); } /** * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ public String postRequest(MediaType contentType, String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.POST, contentType, false, content, urlTemplate, urlVariables); } /** * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ public String postAsyncRequest(MediaType contentType, String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.POST, contentType, true, content, urlTemplate, urlVariables); } /** * @param content * @param urlTemplate * @param urlVariables * @return */ public String postRequest(String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.POST, MediaType.APPLICATION_JSON, false, content, urlTemplate, urlVariables); } /** * @param content * @param urlTemplate * @param urlVariables * @return */ public String postAsyncRequest(String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.POST, MediaType.APPLICATION_JSON, true, content, urlTemplate, urlVariables); } /** * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ public String putRequest(MediaType contentType, String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.PUT, contentType, false, content, urlTemplate, urlVariables); } /** * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ public String putAsyncRequest(MediaType contentType, String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.PUT, contentType, true, content, urlTemplate, urlVariables); } /** * @param content * @param urlTemplate * @param urlVariables * @return */ public String putRequest(String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.PUT, MediaType.APPLICATION_JSON, false, content, urlTemplate, urlVariables); } /** * @param content * @param urlTemplate * @param urlVariables * @return */ public String putAsyncRequest(String content, String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.PUT, MediaType.APPLICATION_JSON, true, content, urlTemplate, urlVariables); } /** * @param urlTemplate * @param urlVariables * @return */ public String deleteRequest(String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.DELETE, null, false, null, urlTemplate, urlVariables); } /** * @param urlTemplate * @param urlVariables * @return */ public String deleteAsyncRequest(String urlTemplate, Object... urlVariables) { return doRequest(RequestMethod.DELETE, null, true, null, urlTemplate, urlVariables); } /** * @param filePath * @return */ public String readJsonFile(String filePath) { BufferedReader bufferReader = null; try { File file = new File(filePath); long length = file.length(); if (length > 5 * 1024 * 1024) { throw new IllegalArgumentException("试图读取的文件大小超过5M"); } return IOUtils.toString(new FileInputStream(file), "UTF-8"); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(filePath, e); } finally { try { if (null != bufferReader) { bufferReader.close(); } } catch (Exception e) { } } } /** * * @param method * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ protected String doRequest(RequestMethod method, MediaType contentType, boolean async, String content, String urlTemplate, Object... urlVariables) { checkMappedController(urlTemplate); MockHttpServletRequestBuilder builder; switch (method) { case GET: builder = MockMvcRequestBuilders.get(urlTemplate, urlVariables); break; case POST: builder = MockMvcRequestBuilders.post(urlTemplate, urlVariables); break; case PUT: builder = MockMvcRequestBuilders.put(urlTemplate, urlVariables); break; case DELETE: builder = MockMvcRequestBuilders.delete(urlTemplate, urlVariables); break; default: throw new UnsupportedOperationException(method.name()); } if (loginBefore && login(userName, password)) { builder.session(session); } if (content != null) { builder.contentType(contentType).content(content); } try { MvcResult mvcResult = mockMvc.perform(builder).andReturn(); return async ? mvcResult.getAsyncResult().toString() : mvcResult.getResponse().getContentAsString(); } catch (Exception e) { return hanldeRequestException(e, method, contentType, content, urlTemplate, urlVariables); } } /** * 上传文件 * * @param file * 文件域名称 * @param path * 路由 * @param urlTemplate * @param async * 是否是异步请求 * @param urlVariables * @return */ public String fileUpload(String file, String path, String urlTemplate, boolean async, Object... urlVariables) { checkMappedController(urlTemplate); MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.fileUpload(urlTemplate, urlVariables); if (loginBefore && login(userName, password)) { builder.session(session); } try { builder.file(file, FileUtils.readFileToByteArray(new File(path))); MvcResult mvcResult = mockMvc.perform(builder).andReturn(); return async ? mvcResult.getAsyncResult().toString() : mvcResult.getResponse().getContentAsString(); } catch (Exception e) { return hanldeRequestException(e, RequestMethod.POST, null, null, urlTemplate, urlVariables); } } /** * @param e * @param method * @param contentType * @param content * @param urlTemplate * @param urlVariables * @return */ protected String hanldeRequestException(Exception e, RequestMethod method, MediaType contentType, String content, String urlTemplate, Object... urlVariables) { return null; } /** * 登录 * * @param userName * @param password * @return * @throws Exception * @throws UnsupportedEncodingException */ private boolean login(String userName, String password) { User user = new User(userName, password); MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post("/users/login"); builder.contentType(MediaType.APPLICATION_JSON).content(gson.toJson(user)); String result = null; try { MvcResult mvc = mockMvc.perform(builder).andReturn(); this.session = (MockHttpSession) mvc.getRequest().getSession(); result = mvc.getResponse().getContentAsString(); } catch (Exception e) { throw new IllegalStateException(String.format("用户名[%s],密码[%s]登录异常,请重新登录。", userName, password)); } Assert.state(Boolean.parseBoolean(result), String.format("用户名[%s],密码[%s]登录失败,请验证用户名密码。", userName, password)); this.loginBefore = false; return true; } /** * 校验请求的路由是否匹配指定的Controller,主要根据Controller上的@RequestMapping()来校验 * * @param urlTemplate */ private void checkMappedController(String urlTemplate) { Assert.notNull(mappedController, "必须指明当前ControllerTest映射到哪个Controller"); Class<?> controllerClass = AopUtils.isAopProxy(mappedController) ? AopUtils.getTargetClass(mappedController) : mappedController.getClass(); RequestMapping mapping = controllerClass.getAnnotation(RequestMapping.class); Assert.notNull(mapping, "mappedController必须含有[RequestMapping]注解"); boolean mapped = false; for (String value : mapping.value()) { if (value.contains("{")) { value = value.substring(0, value.indexOf("{") + 1); // 当@RequestMapping("/user/{id}")形式时,截取"/user" } if (urlTemplate.startsWith(value)) { mapped = true; break; } } if (!mapped) { throw new CustomizedException(String.format("请求路由[%s]不匹配Controller:[%s]", urlTemplate, mappedController.getClass().getName())); } } /** * 模板方法,由子类重写以决定是否在运行之前登录 */ protected abstract void init();}
使用方法:
package com.bob.test.controller;import com.bob.config.mvc.model.CacheModel;import com.bob.test.config.BaseControllerTest;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import com.bob.mvc.controller.RedisCacheController;import com.google.gson.Gson;/** * @since 2016年12月8日 下午5:16:52 * @version $Id$ * @author JiangJibo * */public class StudentControllerTest extends BaseControllerTest { @Autowired //需要指定当前ControllerTest测试的是哪个Controller private RedisCacheController studentController; /* (non-Javadoc) * @see com.bob.test.config.BaseControllerTest#init() */ @Override protected void init() { super.mappedController = studentController; super.userName = "lanboal"; super.password = "123456"; //若需要在运行Controler测试前登陆,则需要在BaseControllerTest的login方法内指定你登陆的请求路径, //同时设置好登陆名及密码,这样在运行单元测试前会先执行登陆操作,然后将登录的SESSION传递给当前的测试用例, //当前测试时就能获取到用户的登录信息。 super.loginBefore = true; } @Test public void testFormatDate() { String result = this.getRequest("/stus/date?date=1988-07-26", ""); System.out.println("\t" + result); } @Test public void testListAll() throws Exception { //如果请求的是异步的,要求Controler的相应方法返回的对象时DeferredResult,Callable,WebAsyncTask这三个。 String result = this.getAsyncRequest("/stus?mediaType=xml", ""); System.out.println("\t" + result); } @Test public void testListByAge() throws Exception { String result = this.getRequest("/stus/age/27", ""); System.out.println("\t" + result); } @Test public void testCreate() { CacheModel sutdent = new CacheModel(); sutdent.setId(10); sutdent.setAge(30); sutdent.setAdress("金华"); sutdent.setTelephone("1748568745"); this.postRequest(new Gson().toJson(sutdent), "/stus", ""); }}
阅读全文
0 0
- Spring整合MockMvc单元测试,Java配置
- spring中用MockMvc做单元测试
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)MockMvc服务端的单元测试
- spring整合单元测试注解配置
- 使用MockMvc进行Spring的单元测试
- Spring-MockMvc
- spring整合junit单元测试
- spring整合JUnit单元测试
- Java Ehcache整合spring配置
- java jmx整合Spring配置
- Mockmvc单元测试controller层代码
- Junit4 + MockMvc 进行单元测试,springboot controller单元测试
- Junit单元测试与Spring整合
- Spring整合JUnit进行单元测试
- spring和单元测试做整合
- Spring整合Junit4进行单元测试
- Spring整合Junit4进行单元测试
- OkHttp解析
- JSP, Servlet常见面试题详解
- K-最近邻法(KNN)简介
- json和jsonP
- java枚举类
- Spring整合MockMvc单元测试,Java配置
- windows下安装pywin32报错:close failed in file object destructor:sys.excepthook is missing lost sys.stderr
- 区块链技术如何实现转账山寨币交易验证系统的开发
- 基于MT4平台实现二元交易的思路
- 现在怎么获取积分?
- Linux下fdisk格式化TF卡,创建分区
- 简单的接口回调(页面跳转) 继承RelativeLayout
- Html 笔记
- ADAS-DL-车道线检测