利用junit对springMVC的Controller进行测试

本文介绍如何利用JUnit4实现对Spring MVC框架中控制器层的单元测试,通过模拟HTTP请求来验证控制器方法的正确性,避免频繁重启服务器带来的效率损失。包括两种测试代码示例,一种直接调用方法,另一种通过Spring MVC测试工具进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[url]http://zhangzhaoaaa.iteye.com/blog/2200096[/url]
平时对junit测试service/DAO层已经很熟悉不过了,如果不了解,可以猛戳这里[url]http://zhangzhaoaaa.iteye.com/blog/2033355[/url],但是我们要测试controller层,不能总重启服务器吧,(重启tomcat好慢的飘过,别。。。别走啊),那么我们就用junit4模拟请求,测试controller层的方法。
代码1:直接Controller调用方法
import static org.junit.Assert.*;  

import java.sql.SQLException;

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.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zz.login.web.LoginController;

/**
* @author zhzh
* 2015-4-7
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:/beans.xml","classpath*:/spring-mvc.xml"})
public class TestController {

// 模拟request,response
private MockHttpServletRequest request;
private MockHttpServletResponse response;

// 注入loginController
@Autowired
private LoginController loginController ;

// 执行测试方法之前初始化模拟request,response
@Before
public void setUp(){
request = new MockHttpServletRequest();
request.setCharacterEncoding("UTF-8");
response = new MockHttpServletResponse();
}
/**
*
* @Title:testLogin
* @Description: 测试用户登录
*/
@Test
public void testLogin() {
try {
request.setParameter("userName", "admin");
request.setParameter("password", "2");
assertEquals("login",loginController.loginIn(request,response)) ;
} catch (Exception e) {
e.printStackTrace();
}
}
}



代码2:调用请求路径
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;  
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;

import org.junit.Before;
import org.junit.Test;
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.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;

/**
* @author zhzh
* 2015-4-7
*/
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({"classpath*:/beans.xml","classpath*:/spring-mvc.xml"})
//当然 你可以声明一个事务管理 每个单元测试都进行事务回滚 无论成功与否
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class TestController2 {
@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void setup() {
this.mockMvc = webAppContextSetup(this.wac).build();
}

@Test
public void testLogin() throws Exception {
mockMvc.perform((post("/loginTest").param("userName", "admin").param("password", "1"))).andExpect(status().isOk())
.andDo(print());
}

/*@Test
//有些单元测试你不希望回滚
@Rollback(false)
public void testInsert() throws Exception {
mockMvc.perform((post("/insertTest"))).andExpect(status().isOk())
.andDo(print());
} */
}

注意:import static 的spring类


代码3: LoginController代码片段
/** 
* 登录入口
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/loginTest", method = RequestMethod.POST)
public String loginTest(HttpServletRequest request,HttpServletResponse response){
String account = request.getParameter("userName");
String password = request.getParameter("password");
if (account.equals("admin")&&password.equals("1")){
return "index";
}else{
return "login";
}
}


参考:[url]http://blog.youkuaiyun.com/a95473004/article/details/8926929[/url]
[url]http://ysj5125094.iteye.com/blog/2082110[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值