`

Spring MVC的单元测试

阅读更多

Original link:http://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-mvc-controllers-normal-controllers/

翻译地址:http://www.cnblogs.com/zemliu/archive/2013/10/14/3367055.html

 

我自己写的例子:

 

public class PlayerControllerTest extends SpringWebTestCase {

	private MockMvc mockMvc;
	
	@Autowired
	private PlayerController controller;

	@Before
	public void setUp() {
		mockMvc = standaloneSetup(controller).build();
	}

	@Test
	public void testRegister() throws Exception {
		MockHttpServletRequestBuilder mock = post("/register");
		mock.contentType(MediaType.APPLICATION_FORM_URLENCODED)
			.param("loginId", "peak")
			.param("name", "gogogo")
			.param("password", "111")
			.param("mobile", "139")
			.param("email", "peak@eastseven.com");
		mockMvc.perform(mock)
			.andExpect(status().isOk())
			.andExpect(content().contentType("application/json;charset=UTF-8"))
			.andExpect(content().json("{\"success\":true,\"message\":\"操作成功\"}"))
			.andDo(print())
			.andReturn();
	}
}

为了简化静态引入,把父类里面加入了所有mock的方法进来,用的是Jackson

import java.net.URI;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.xml.xpath.XPathExpressionException;

import org.hamcrest.Matcher;
import org.springframework.http.HttpMethod;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.ResultHandler;
import org.springframework.test.web.servlet.ResultMatcher;
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.result.ContentResultMatchers;
import org.springframework.test.web.servlet.result.CookieResultMatchers;
import org.springframework.test.web.servlet.result.FlashAttributeResultMatchers;
import org.springframework.test.web.servlet.result.HandlerResultMatchers;
import org.springframework.test.web.servlet.result.HeaderResultMatchers;
import org.springframework.test.web.servlet.result.JsonPathResultMatchers;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.result.ModelResultMatchers;
import org.springframework.test.web.servlet.result.RequestResultMatchers;
import org.springframework.test.web.servlet.result.StatusResultMatchers;
import org.springframework.test.web.servlet.result.ViewResultMatchers;
import org.springframework.test.web.servlet.result.XpathResultMatchers;
import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring-mvc.xml" })
public class SpringWebTestCase extends SpringTransactionalTestCase {
	
	public static MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables) {
		return MockMvcRequestBuilders.get(urlTemplate, urlVariables);
	}

	public static MockHttpServletRequestBuilder get(URI uri) {
		return MockMvcRequestBuilders.get(uri);
	}

	public static MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables) {
		return MockMvcRequestBuilders.post(urlTemplate, urlVariables);
	}

	public static MockHttpServletRequestBuilder post(URI uri) {
		return MockMvcRequestBuilders.post(uri);
	}
	
	public static MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables) {
		return MockMvcRequestBuilders.request(httpMethod, urlTemplate, urlVariables);
	}

	public static MockHttpServletRequestBuilder request(HttpMethod httpMethod, URI uri) {
		return MockMvcRequestBuilders.request(httpMethod, uri);
	}

	public static MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables) {
		return MockMvcRequestBuilders.fileUpload(urlTemplate, urlVariables);
	}

	public static MockMultipartHttpServletRequestBuilder fileUpload(URI uri) {
		return MockMvcRequestBuilders.fileUpload(uri);
	}

	public static RequestBuilder asyncDispatch(final MvcResult mvcResult) {
		return MockMvcRequestBuilders.asyncDispatch(mvcResult);
	}

	public static ResultHandler print() {
		return MockMvcResultHandlers.print();
	}
	
	public static DefaultMockMvcBuilder webAppContextSetup(WebApplicationContext context) {
		return MockMvcBuilders.webAppContextSetup(context);
	}

	public static StandaloneMockMvcBuilder standaloneSetup(Object... controllers) {
		return MockMvcBuilders.standaloneSetup(controllers);
	}
	
	public static RequestResultMatchers request() {
		return MockMvcResultMatchers.request();
	}

	public static HandlerResultMatchers handler() {
		return MockMvcResultMatchers.handler();
	}

	public static ModelResultMatchers model() {
		return MockMvcResultMatchers.model();
	}

	public static ViewResultMatchers view() {
		return MockMvcResultMatchers.view();
	}

	public static FlashAttributeResultMatchers flash() {
		return MockMvcResultMatchers.flash();
	}

	public static ResultMatcher forwardedUrl(final String expectedUrl) {
		return MockMvcResultMatchers.forwardedUrl(expectedUrl);
	}

	public static ResultMatcher forwardedUrlPattern(final String urlPattern) {
		return MockMvcResultMatchers.forwardedUrlPattern(urlPattern);
	}

	public static ResultMatcher redirectedUrl(final String expectedUrl) {
		return MockMvcResultMatchers.redirectedUrl(expectedUrl);
	}

	public static ResultMatcher redirectedUrlPattern(final String expectedUrl) {
		return MockMvcResultMatchers.redirectedUrlPattern(expectedUrl);
	}

	public static StatusResultMatchers status() {
		return MockMvcResultMatchers.status();
	}

	public static HeaderResultMatchers header() {
		return MockMvcResultMatchers.header();
	}

	public static ContentResultMatchers content() {
		return MockMvcResultMatchers.content();
	}

	public static JsonPathResultMatchers jsonPath(String expression, Object ... args) {
		return MockMvcResultMatchers.jsonPath(expression, args);
	}

	public static <T> ResultMatcher jsonPath(String expression, Matcher<T> matcher) {
		return MockMvcResultMatchers.jsonPath(expression, matcher);
	}

	public static XpathResultMatchers xpath(String expression, Object... args) throws XPathExpressionException {
		return MockMvcResultMatchers.xpath(expression, args);
	}

	public static XpathResultMatchers xpath(String expression, Map<String, String> namespaces, Object... args)
			throws XPathExpressionException {

		return MockMvcResultMatchers.xpath(expression, namespaces, args);
	}

	public static CookieResultMatchers cookie() {
		return MockMvcResultMatchers.cookie();
	}
	
	public byte[] convertObjectToFormUrlEncodedBytes(Object object) {
		ObjectMapper mapper = new ObjectMapper();
		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
		@SuppressWarnings("unchecked")
		Map<String, Object> propertyValues = mapper.convertValue(object, Map.class);
		Set<String> propertyNames = propertyValues.keySet();
		Iterator<String> nameIter = propertyNames.iterator();

		StringBuilder formUrlEncoded = new StringBuilder();

		for (int index = 0; index < propertyNames.size(); index++) {
			String currentKey = nameIter.next();
			Object currentValue = propertyValues.get(currentKey);

			formUrlEncoded.append(currentKey);
			formUrlEncoded.append("=");
			formUrlEncoded.append(currentValue);

			if (nameIter.hasNext()) {
				formUrlEncoded.append("&");
			}
		}

		return formUrlEncoded.toString().getBytes();
	}
}

 

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

import javax.sql.DataSource;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

@DirtiesContext
@ContextConfiguration(locations = { "classpath*:/spring-core.xml"})
public abstract class SpringTransactionalTestCase extends AbstractTransactionalJUnit4SpringContextTests {

	protected static final Logger log = LoggerFactory.getLogger(SpringTransactionalTestCase.class);

	protected DataSource dataSource;

	@Override
	@Autowired
	public void setDataSource(DataSource dataSource) {
		super.setDataSource(dataSource);
		this.dataSource = dataSource;
	}
	
	protected <T> T creatRandomObject(Class<T> clazz, String... excludeFieldNames) {
		T obj = null;
		try {
			obj = clazz.newInstance();
			BeanInfo beanInfo = Introspector.getBeanInfo(clazz, IdEntity.class);
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor descriptor : propertyDescriptors) {
				if ("class".equals(descriptor.getName()) || ArrayUtils.contains(excludeFieldNames, descriptor.getName())) {
					continue;
				}
				if (BeanUtils.isSimpleValueType(descriptor.getPropertyType())) {
					Object value = ConvertUtils.convert(RandomStringUtils.random(1, false, true), descriptor.getPropertyType());
					Method writeMethod = descriptor.getWriteMethod();
					if (writeMethod != null) {
						writeMethod.invoke(obj, value);
					}
				}
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return obj;
	}
}

 

分享到:
评论

相关推荐

    spring mvc的简单单元测试

    spring mvc的简单单元测试:,详细请参考:http://blog.csdn.net/xiejx618/article/details/21201007

    精通Spring MVC 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    spring mvc jpa单元测试例子

    这是一个测试事务管理的例子,希望对你们有所帮助,项目里子是在myeclipse中的maven创建的。myeclipse应该可以直接运行。

    Spring MVC入门教程

    十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八...

    Spring MVC 教程 快速入门 深入分析

    十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八...

    Spring Boot中的单元测试.pdf

    Spring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot中的单元测试.pdfSpring Boot...

    spring MVC junit 单元测试(controller)

    NULL 博文链接:https://zkf60553.iteye.com/blog/1604723

    SpringMVC框架架构介绍

    十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean ...

    单元测试案例junit +spring mvc +springboot

    单元测试案例junit +spring mvc +springboot

    test-mvc:使用 Spring MVC 测试框架进行测试

    该项目的目标是证明: 如何使用 DispatcherServlet 为控制器编写单元测试来处理请求,从而在不需要运行 Servlet 容器的情况下近似完整的集成测试; 如何编写集成测试来测试所有应用程序层的集成,而无需运行 ...

    精通Spring MVC 4 [精校高清版](Geoffroy.Warin). pdf

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    Spring+spring MVC+MyBatis示例

    Spring+spring MVC+MyBatis示例程序,maven构建,程序演示了增、删、改、查、分页、单元测试等有代表性的操作,可供初学者借鉴。

    spring mvc框架demo

    spring mvc框架搭建demo,同时支持junit单元测试的实例demo。

    精通spring mvc 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    精通SpringMVC(高清目录版含源码实例)

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    Ant+Junit+Svn实现自动单元测试

    Ant+Junit+Svn实现自动单元测试

    spring4.0 mvc api

    spring4.0 mvc api 单元测试 文件上传 ,文件下载

    spring mvc后台管理系统

    session-data-redis解决分布式统一session管理,也有junit4单元测试,前端jQuery、bootstrap、以及其他很多流行的js组件。目前已经完整整合,即可做为restapi也可作为前端展示,一般的业务可以基于此快速开发,大幅...

Global site tag (gtag.js) - Google Analytics