java如何测controller层_用MockMvc对Spring mvc中的controller层进行单元测试

本文介绍了如何使用MockMvc对Spring MVC的Controller层进行单元测试,无需启动Tomcat服务器。通过MockMvcBuilders.standaloneSetup创建测试环境,并模拟POST请求,设置请求参数,然后验证返回的ModelAndView中的视图名和数据。

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

参考:http://sishuok.com/forum/posts/list/7981.html  ;  http://www.tuicool.com/articles/6nqeIbm

用下面的这种方式,不需要启动tomcat服务器。

由于不好的叙述,在这就只是简单的描述了。

首先实体类User:

public class User {

private int id;

private String name;

private int age;

private String email;

......get、set、toString方法省略.....

}

UserController的代码如下:

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

import com.mjduan.learnMockMvc.entity.User;

import com.mjduan.learnMockMvc.service.UserService;

import com.mjduan.learnMockMvc.util.outUtil.Out;

@Controller

@RequestMapping("/UserController")

public class UserController {

@Autowired

@Qualifier("UserService")

private UserService userService;

@RequestMapping("/login")

public ModelAndView login(HttpServletRequest request,

HttpServletResponse response) throws UnsupportedEncodingException{

request.setCharacterEncoding("UTF-8");

String name = request.getParameter("name").trim();

String password = request.getParameter("password").trim();

Out.println("接收到的name:"+name+"/ password:"+password);

ModelAndView modelAndView = new ModelAndView();

User user = this.userService.getUserById(10012);

modelAndView.addObject("user", user);

modelAndView.setViewName("/jsp/success.jsp");

return modelAndView;

}

}

之后就是对UserController进行单元测试的UserControllerTest:

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

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

import org.springframework.test.web.servlet.MvcResult;

import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.mjduan.learnMockMvc.controller.UserController;

import com.mjduan.learnMockMvc.entity.User;

import com.mjduan.learnMockMvc.util.outUtil.Out;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"classpath:SpringApplicationContext.xml"})

public class UserControllerTest {

@Autowired

ApplicationContext ctx;

private MockMvc mockMvc;

private UserController userController;

@Before

public void before(){

//从spring容器中获得UserController对象

userController = (UserController) ctx.getBean("userController");

//MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,通过build得到一个MockMvc

//独立测试方式,不需要启动tomcat服务器

mockMvc = MockMvcBuilders.standaloneSetup(userController).build();

}

@Test

public void testLogin(){

try {                                     //通过post方法来模拟post请求方式

MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/UserController/login")

.param("name", "jack") //设置请求参数为name=jack

.param("password", "123456")) //设置请求参数为password=123456

.andExpect(MockMvcResultMatchers.view().name("/jsp/success.jsp")) //期望返回的ModelAndView中的viewName是/jsp/success.jsp

.andExpect(MockMvcResultMatchers.model().attributeExists("user")) //期望返回的ModelAndView中含有数据user(user是一个key)

.andExpect(MockMvcResultMatchers.model().attributeDoesNotExist("list")) //期望返回的ModelAndView中没有数据list

.andReturn();

//请求执行完毕之后所有的结果保存在mvcResult中

User user = (User) mvcResult.getModelAndView().getModel().get("user");

Out.println("得打的user:"+user.toString());

//Assert.assertNotNull(object);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值