`

如何在springMVC 中对REST服务使用mockmvc 做测试

阅读更多
spring 集成测试中 对mock 的集成实在是太棒了!但是使用请注意一下3个条件。
 
  • junit 必须使用4.9以上
  • 同时您的框架必须是用spring mvc 
  • spring 3.2以上才完美支持
 
目前使用spring MVC 取代struts2 的很多,spring MVC 的各种灵活让人无比销魂!所以使用spring MVC吧!
以前在对接口(主要是java服务端提供的接口(一般是:webService,restful))进行测试的中 一般用以下俩种方法。测试流程如图:


 
1 直接使用httpClient 
    这方法各种麻烦
 
2 使用Spring 提供的RestTemplate
    错误不好跟踪,必须开着服务器
 
使用mockMVC都不是问题了看使用实例:
 
使用事例如下:父类
 
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.context.WebApplicationContext;

@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:applicationContext.xml",  
"classpath:xxxx-servlet.xml" })
public class AbstractContextControllerTests {

	@Autowired
	protected WebApplicationContext wac;

}

子类:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.conlect.oatos.dto.status.RESTurl;
import com.qycloud.oatos.server.service.PersonalDiskService;

//这个必须使用junit4.9以上才有。
@RunWith(SpringJUnit4ClassRunner.class)
public class PersonalDiskMockTests extends AbstractContextControllerTests {
	
	
	private static String URI = RESTurl.searchPersonalFile;

	private MockMvc mockMvc;
	
	private String json ="{\"entId\":1234,\"userId\":1235,\"key\":\"new\"}";
	
	@Autowired
	private PersonalDiskService personalDiskService;

	@Before
	public void setup() {
		//this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
		this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build();
	}

@Test
	public void readJson() throws Exception {
		this.mockMvc.perform(
				post(URI, "json").characterEncoding("UTF-8")
					.contentType(MediaType.APPLICATION_JSON)
					.content(json.getBytes()))
				.andExpect(content().string("Read from JSON: JavaBean {foo=[bar], fruit=[apple]}")
					);
	}
 
上面是简单的例子,实际使用起来可以稍做修改。记得导入spring -test jar 包。无需额外配置(是不是很方便!)
当然和junit 的assert 一起用的话效果更好。下面贴点例子。copy就能跑。
package com.qycloud.oatos.server.test.mockmvcTest;

import static org.junit.Assert.fail;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;

import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import com.conlect.oatos.dto.status.CommConstants;
import com.conlect.oatos.dto.status.ErrorType;
import com.conlect.oatos.http.PojoMapper;

public class MockUtil {

	/**
	 * mock
	 * 
	 * @param uri
	 * @param json
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws Exception
	 */
	public static String mock(MockMvc mvc, String uri, String json)
			throws UnsupportedEncodingException, Exception {
		return mvc
				.perform(
						post(uri, "json").characterEncoding("UTF-8")
								.contentType(MediaType.APPLICATION_JSON)
								.content(json.getBytes())).andReturn()
				.getResponse().getContentAsString();
	}

	
	/**
	 * 
	 * @param re 返回值
	 * @param object 要转换的对象
	 * @param testName 当前测试的对象
	 */
	public static <T> void check(String re, Class<T> object,String testName) {
		System.out.println(re);
		if (ErrorType.error500.toString().equals(re)) {
			System.out.println("-----该接口测试失败:-----"
					+ testName);
			fail(re);
		} else if (CommConstants.OK_MARK.toString().equals(re)) {
			System.out.println("-----该接口测试成功:-----"
					+ testName);
		}else{
			System.out.println("-----re----- :"+re);
		}
		if (object != null) {
			if (re.contains(":")) {
				try {
					T t = PojoMapper.fromJsonAsObject(re, object);
					System.out.println("-----该接口测试成功:-----"
							+ testName);
				} catch (Exception e) {
					System.out.println("-----该接口测试失败:-----"
							+ testName);
					fail(e.getMessage());
				}
			}
		}

	}


	/**
	 * 初始化版本信息。每次调用测试用力之前首先更新版本信息
	 * @param mockMvc
	 * @param url
	 * @param fileId
	 * @param class1
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws Exception
	 */
	public static <T> Long updateVersion(MockMvc mockMvc, String url,
			Long fileId, Class<T> class1) throws UnsupportedEncodingException, Exception {
		
		String re = mock(mockMvc, url, fileId+"");
		
		T dto = PojoMapper.fromJsonAsObject(re, class1);
		
Long version = Long.parseLong(dto.getClass().getMethod("getVersion").invoke(dto).toString());	
		System.out.println("version = "+version);
		
		return version;
		
	}
	
}
 使用如下:
@RunWith(SpringJUnit4ClassRunner.class)
public class PersonalDiskMockTests extends AbstractContextControllerTests {

	private MockMvc mockMvc;

	private static Long entId = 1234L;
	private static Long adminId = 1235L;




	@Autowired
	private PersonalDiskService personalDiskService;

	@Before
	public void setup() {
		this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)
				.build();
	}

	/***
	 * pass
	 * 全局搜索企业文件
	 * 
	 * @throws Exception
	 */
	@Test
	public void searchPersonalFile() throws Exception {

		SearchFileParamDTO sf = new SearchFileParamDTO();
		sf.setEntId(entId);
		sf.setKey("li");
		sf.setUserId(adminId);

		String json = PojoMapper.toJson(sf);

		String re = MockUtil.mock(this.mockMvc, RESTurl.searchPersonalFile,
				json);
		MockUtil.check(re, SearchPersonalFilesDTO.class, "searchPersonalFile");

	}
}
 当然@setup里面是每个@test执行时都会执行一次的,所以有些需要每次都实例化的参数可以放进来
如下:
@Autowired
	private ShareDiskService shareDiskService;

	@Before
	public void setup() {
		this.mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)
				.build();
		try {
			initDatas();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	

	private void initDatas() throws UnsupportedEncodingException, Exception {
		FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO.class);
		File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO.class);
		oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId,ShareFolderDTO.class);
	}
 ok!基本使用大致如此,代码没有些注释,但是很简单,看懂是没问题的。权当抛砖引玉。希望大家加以指正!
  • 大小: 40.1 KB
5
4
分享到:
评论
5 楼 u010244357 2017-02-23  
你用了部分是自己的包,怎么跑呢,先生。
4 楼 Abird2Simba 2016-09-21  
你用了部分是自己的包,怎么跑呢,先生。
3 楼 javer 2016-05-25  
javer 写道
代码看着有点乱啊,怎么搞的

sorry,原来是浏览器问题
2 楼 javer 2016-05-25  
代码看着有点乱啊,怎么搞的
1 楼 u011643314 2015-03-24  
你用了部分是自己的包,怎么跑呢,先生。

相关推荐

    SpringMVC PPT_springmvc_

    SpringMVC 提供了 MockMVC 工具,可以方便地对 Controller 进行单元测试,无需部署到服务器。 总结,SpringMVC 以其强大的功能和灵活性,成为了 Java Web 开发的主流框架之一。通过理解并熟练掌握上述知识点,...

    SpringMVC API

    在SpringMVC中,可以使用HibernateTemplate或JPA(Java Persistence API)来进一步简化数据库操作,使得代码更加整洁且易于测试。 在SpringMVC中集成Hibernate,首先需要配置Hibernate的SessionFactory,并将其注入...

    springMVC教案.rar

    SpringMVC提供了MockMvc工具,允许在不依赖Web服务器的情况下进行单元测试和集成测试。 这份教案将涵盖以上各个知识点,并可能包括实践案例和代码示例,帮助初学者理解SpringMVC的工作原理,掌握如何构建和调试...

    spring mvc rest基础学习demo

    在"spring mvc rest基础学习demo"中,我们将深入探讨如何使用Spring MVC构建RESTful API。 REST(Representational State Transfer,表现层状态转移)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以...

    (代码)SpringMVC第7讲:json支持

    6. **HTTP GET与POST请求**:虽然JSON通常用于POST请求中传输数据,但SpringMVC也支持在GET请求中使用JSON。只需要确保请求头中的`Accept`字段包含`application/json`,服务器就会返回JSON格式的响应。 7. **...

    详解Spring MVC如何测试Controller(使用springmvc mock测试)

    2. `@WebAppConfiguration`:使用此注解会在运行单元测试时启动一个模拟的Web服务环境,用于调用Controller的REST API,测试完成后会自动关闭。 3. `@ContextConfiguration`:指定Spring配置文件的位置,可以是文件...

    SpringMvc 4

    SpringMvc提供了MockMvc工具,允许在没有实际服务器环境的情况下进行单元测试。而Spring Test支持整合测试,可以在实际环境中模拟请求和验证响应。 综上所述,SpringMvc 4为开发者提供了强大且灵活的Web开发框架,...

    springmvc之restful风格CRUD

    使用JUnit和MockMVC可以方便地对RESTful接口进行单元测试,确保它们按预期工作。 10. **API文档**: 使用Swagger或ApiDoc等工具自动生成API文档,方便开发者理解和使用。 通过以上步骤,我们可以构建出一套完整...

    SpringMVC部分【第2天相关资料及源代码】.

    SpringMVC提供MockMVC工具,可以在不启动服务器的情况下进行单元测试和集成测试。 **11. 源代码分析** 在提供的"code"目录下,可能包含了示例代码,这些代码可能展示了如何创建控制器、配置SpringMVC、处理请求等。...

    SpringMVC

    在实际开发中,我们通常会结合 Spring Boot 使用 SpringMVC,以简化配置和快速启动项目。通过编写 Controller 类,使用 @RequestMapping 注解来指定 URL 映射,然后使用 @Autowired 注解自动装配需要的 Bean。视图...

    SpringMVC入门教程

    - 使用Spring Test模块进行SpringMVC的单元测试,如`MockMvc`类模拟HTTP请求。 - 使用`@WebAppConfiguration`和`@ContextConfiguration`进行集成测试,加载整个Spring应用上下文。 通过这个SpringMVC入门教程,你...

    单元测试的总结

    通过使用Spring Test和`MockMvc`,开发者可以快速地对单个控制器方法进行测试,确保它们在不依赖其他组件的情况下正常工作。这不仅提升了开发速度,还减少了因环境问题导致的错误,从而提高了整体的代码质量和可靠性...

    springMVC4.0常用jar包

    `MockMvc`类允许开发者在不依赖服务器环境的情况下进行单元测试和集成测试,提高了测试效率。 在描述中提到的“常用jar包”,通常包括Spring MVC的核心库,如`spring-webmvc.jar`,以及Spring框架的其他核心组件,...

    springmvc从入门到精通的代码.rar

    在本压缩包 "springmvc从入门到精通的代码.rar" 中,你将找到一系列关于 Spring MVC 学习的资源,包括代码示例,这将帮助你从零基础开始,逐步掌握 Spring MVC 的核心概念和实际应用。 1. **MVC 模式介绍**: MVC ...

    springmvc独立运行包

    在本压缩包中,提供了 Spring MVC 3.2 版本的运行环境,这是一个稳定且广泛使用的版本,适合初学者和开发者进行学习和项目开发。 Spring MVC 的核心特性包括: 1. **模型-视图-控制器架构**:Spring MVC 通过 ...

    springmvc学习笔记-前端控制器、上传、异常、开发心得小结等.zip

    - **单元测试**:利用SpringMVC提供的MockMVC工具,方便地进行控制器的单元测试。 - **拦截器**:自定义拦截器可以实现登录检查、权限控制等功能,提高代码复用性。 5. **实战经验** 开发过程中,我们可能会遇到...

    springmvc-json_v2.zip

    综上所述,"springmvc-json_v2.zip"可能包含了Spring MVC项目中JSON处理的各种示例代码,如控制器、模型类、配置文件等,帮助开发者了解和学习如何在Spring MVC环境中有效地使用JSON进行数据交换。通过对这些知识点...

    SpringMVC4.X:Spring MVC 4.X REST JSON示例

    9. **测试REST服务**: 可以使用JUnit结合MockMvc进行单元测试,模拟HTTP请求并验证响应结果。 10. **安全考虑**: 当构建RESTful服务时,需要考虑安全问题,如认证和授权。Spring Security可以与Spring MVC很好地...

    SpringMVC4教程-超权威--超详细_spriingmvc4_

    SpringMVC以其灵活性、可扩展性和易于测试的特性在Java开发领域广泛应用。本教程将深入探讨SpringMVC4的各个方面,旨在提供一个全面、权威的学习指南。 ### 一、SpringMVC概述 1. **MVC模式**:SpringMVC基于MVC...

    springmvc3.2.0必须jar包

    提供了`MockMvc` API,使得在单元测试中模拟Spring MVC请求和响应变得更加简单。 10. **安全改进**: Spring Security与Spring MVC的集成更加紧密,提供了更多安全相关的注解和配置选项。 11. **性能优化**: ...

Global site tag (gtag.js) - Google Analytics