Spring MVC参数化测试 - Junit Parameterized

参考文章:Spring MVC全注解配置 - 无web.xml

单元测试的目的,简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作。以减少我们在发布的时候出现更过甚至是出现之前解决了的问题再次重现。

Spring MVC的测试往往看似比较复杂。其实他的不同在于,他需要一个ServletContext来模拟我们的请求和响应。但是Spring也针对Spring MVC 提供了请求和响应的模拟测试接口,以方便我们的单元测试覆盖面不只是service,dao层。

我们会结合上一篇文章的配置进行junit的测试。上一篇文章中我们使用纯java代码来配置spring mvc,因此在我们书写junit测试的时候,有三点需要注意,这个和平时的junit测试有点不同

  1. 在测试类上的@ContextConfiguration注解需要指定spring的配置文件,由于我们使用的是java配置,所以这里传递我们的配置类,记住是spring的配置类,而不是web的配置类(注:web的配置我们是通过模拟的)。
  2. 因为controller,component等都是使用注解来,所以我们的@ContextConfiguration使用的是直接来加载的。因此在他的属性中,配置一个loader。同时由于是web的,所以使用AnnotationConfigWebContextLoader。
  3. 由于需要模拟ServletContext,因此我们需要给我们的测试类加上@WebAppConfiguration。

代码如下:

@RunWith(Parameterized.class)
@ContextConfiguration(classes = { WebMVCConfiguration.class }, loader = AnnotationConfigWebContextLoader.class)
@WebAppConfiguration
public class ControllerTest

我的目的是使用参数化来测试controller,所以使用的是@RunWith是参数化的runner。由于junit的runner只能有一个,所以我们这里用另外的方式来让spring的功能也集成进来。

下面一步就是编写我们的测试controller,代码如下:

@Controller
public class TestController {
	@RequestMapping(value = "/test", method = RequestMethod.GET)
	public @ResponseBody String test(String name) {
		return name;
	}
}

在我们的测试类中,我们就正对此Controller的方法进行一个参数的构造。

Junit中参数构造这里就不多讲,@Parameters来标记数据集合,私有属性和构造函数来对应我们的传入参数与预期结果。因此在ControllerTest中我们这样构造数据:

// parameters
private String name;
private String result;

public ControllerTest(String name, String result) {
	this.name = name;
	this.result = result;
}

@Parameters
public static Collection<String[]> data() {
	return Arrays.asList(new String[][] { { "Troy", "Troy" },
			{ "Young", "Young" } });
}

在模拟http request response之前我们需要去模拟一个request和response的环境,同时也要让我们的spring的功能融入进来,这样才能方便我们使用spring的DI等功能。因此这两个都在我们test之前进行配置:

private TestContextManager testContextManager;

private MockMvc mockMvc;

@Autowired
private WebApplicationContext wac;

@Before
public void setUp() throws Exception {
	testContextManager = new TestContextManager(getClass());
	testContextManager.prepareTestInstance(this);

	mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}

此时我们已经具备了环境、参数,接下里就进行真正的测试代码的编写:

@Test
public void test() throws Exception {
	MvcResult rs = mockMvc.perform(
			MockMvcRequestBuilders.get("/test?name=" + name)).andReturn();
	assertEquals("name is not correct", result, new String(rs.getResponse()
				.getContentAsByteArray()));
}

能够很好的运行起来,已经达到我们预期的效果。以后的扩展就只用在data里面去进行扩展配置参数,然后每一次build的时候我们都可以发现我们的build存在bug么。

很多具体的类使用请自行查阅一下。本文只是讲解简单的操作。

时间: 2024-10-14 11:03:48

Spring MVC参数化测试 - Junit Parameterized的相关文章

Spring MVC -- 应用测试

测试在软件开发中的重要性不言而喻.测试的主要目的是尽早发现错误,最好是在代码开发的同时.逻辑上认为,错误发现的越早,修复的成本越低.如果在编程中发现错误,可以立即更改代码:如果软件发布后,客户发现错误所需要的修复成本会很大. 在软件开发中有许多不同的测试,其中两个是单元测试和集成测试.通常从单元测试开始测试类中的单个方法,然后进行集成测试,以测试不同的模块是否可以无缝协同工作. 本篇博客中的示例使用JUnit测试框架以及Spring test模块.Spring test模块中的API可用于单元测

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

在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.为什么要使用mock测试? 使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JD

Spring MVC 异步测试

从spring3.2开始,支持servlet3的异步请求,这对于处理耗时的请求如缓慢的数据库查询是非常有好处的,不至于很快的耗光servlet的线程池,影响可扩展性. 让我们先来了解一下servlet是怎么处理异步操作的: 通过调用request.startAsync(),ServletRequest就变成异步模式.主要的影响是Servlet.Filter会退出,但是Response保持打开用来完成请求处理. 调用request.startAsync()返回AsyncContext实例,可进一步

Junit 4 Tutorials(Junit 4 教程) 四、Junit4 参数化测试

Junit 4 参数化测试 允许通过变化范围的参数值来测试方法.参数擦测试可以通过以下简单的步骤实现: 对测试类添加注解 @RunWith(Parameterized.class) 将需要使用变化范围参数值测试的参数定义为私有变量 使用上一步骤声明的私有变量作为入参,创建构造函数 .创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回. 使用定义的私有变量定义测试方法 Junit 4 参数化测试样例 EvenNumberChecker.java 校验输

为啥Spring和Spring MVC包扫描要分开?

背景:       最近在搭建新工程的时候发现有些Spring的配置不是很了解,比如Spring 配置里面明明配置了component-scan,为啥Spring MVC配置文件还需要配置一下,这样岂不是多此一举?由于以前基本是在现有的工程上直接开发或者别的工程的配置文件直接拷贝过来,所以也没太关注这个问题.出于好奇,谷歌了一下发现原来这个里面大有学问呢,详情请见下文.正常代码如下: Xml代码   <!-- spring 配置文件--> <context:component-scan 

JUnit实战(1) - JUnit起步(Parameterized参数化测试)

创建Java Project项目,项目名称:ch01-jumpstart Calculator.java public class Calculator { public double add(double number1, double number2) { return number1 + number2; } } CalculatorTest.java import static org.junit.Assert.*; import junit.framework.Assert; impo

就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers

就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers 转载注明出处:http://www.cnblogs.com/wade-xu/p/4311205.html 接我前面一篇文章关于RestAssured测试Restful web service的, RestAssured还有一个功能, 使用RestAssuredMockMvc 单元测试你的Spring MVC Controllers, 这个MockMvc 是建立在Spring Moc

JUnit之参数化测试和成组测试的使用

JUnit之参数化测试和成组测试的简单使用 参数化测试 正如数组替代int a0,a1,a2一样,测试加法时assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要测试100个怎么办. 所以,有了参数化测试,使用一个Collection收集所有的数据--加法时每一次测试需要的几个数据构成一组,n个组构成Collection. 然后按照JUnit的用法要求,写出单元测试类.(偷懒一下,不想写被测试的业务类X了.下面的例子中假设要测试的方法是,判断一个数是否奇数

junit 单元测试 - 参数化测试

junit4.x版本需要引入如下jar包: hamcrest-core-1.3.jar junit-4.12-beta-3.jar 新建一个计算器类,如下: package com.pt; public class Calculate { /** * 加法 * @param d1 * @param d2 * @return */ public static double add(double d1,double d2){ return d1 + d2; } /** * 减法 * @param d