MVC应用单元测试以及请求参数的验证

SpringMVC支持对Controller单元测试

java 复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
	"classpath:mvc-dispatcher-servlet.xml",
})
@WebAppConfiguration
public class ControllerJUnitBase{
	
	@Resource
	private RequestMappingHandlerMapping handlerMapping;
	@Resource 
	private RequestMappingHandlerAdapter handlerAdapter;
	
	//执行request对象请求的action
	public ModelAndView excuteAction(HttpServletRequest request,HttpServletResponse response)throws Exception{
		
		HandlerExecutionChain chain = handlerMapping.getHandler(request);
		
		final ModelAndView model = handlerAdapter.handle(request,response,chain.getHeader());
		return model;
	}

	@Test
	public void test throws Exception(){
		
		//Mock构建request,response
		MockHttpServletRequest request = new MockHttpServletRequest();
		request.setRequestURI("/api/user/login");
		request.setParameter("mobile","190xxxx1234");
		request.setMethod("POST");
		MockHttpServletResponse response = new MockHttpServletResponse();
		
		final ModelAndView mav = this.excuteAction(request,response);
		Assert.assertEquals("user_login",mav.getViewName());
	}
}		

验证Web请求参数

一、通过Spring框架定义的Validator接口定义的校验

java 复制代码
public class UserValidator implements Validator{
	
	@Override
	public boolean supports(Class<?> clazz){
		return clazz.equals(User.class);
	}

	@Override
	public void validate(Object target,Errors errors){
		ValidationUtils.rejectIfEmpty(errors,"name","user.name.required","用户名不能为空");
		User user = (User)target;
		if(length > 10){
			errors.rejectValue("name","user.name.too_long","用户不能超过20个字符");
		}
	}
}	

在Controller里增加方法并以@InitBinder注解在对应的Controller方法中触发

java 复制代码
@InitBinder
protected void initBinder(WebDataBinder binder){

	binder.setValidator(new UserValidator());
}

@RequestMapping(method = RequestMethod.POST)
public String reg(@Validated User user,BindingResult result){
	
	//如果校验没有通过
	if(result.hasErrors()){
		return "user";
	}
	if(user != null){
		userService.saveUser(user);
	}
	return "user";
}

从页面提交的User对象,通过实现的UserValidator类校验,校验结果存入BindingResult对象中

二、支持JSR-303 Beam Validator定义的校验规范

不仅可以对Spring的MVC进行校验,也可以对Hibernate的存储对象进行校验

引入hibernate-validator,并开启MVC注解mvc:annotation-driven/

还需要对校验的meta类的属性做注解限制

  • @Null 验证对象是否为空
  • @NotNull 验证对象是否为非空
  • @AssertTrue 验证Boolean对象是否为true
  • @AssertFalse验证Boolean对象是否为false
  • @Min 验证Number和String对象是否大于或等于指定的值
  • @Max 验证Number和String对象是否小于或等于指定的值
  • @DecimalMin 验证Number和String对象是否大于或等于指定的值,需要注意小数的精度问题
  • @DecimalMax 验证Number和String对象是否小于或等于指定的值,需要注意小数点的精度问题
  • @Size 验证对象(Array,Collection,Map,String)长度是否在给定的范围内
  • @Digits 验证Number和String的构成是否合法
  • @Past 验证Date和Calendar对象是否在当前时间之前
  • @Future 验证Date和Calendar对象是否在当前时间之后
  • @Pattern 验证String对象是否符合正则表达式的规则

此外hibernate-validator也提供了一些注解支持

  • @NotEmpty 验证对象不为NULL也不为empty
  • @NotBlank 验证对象NULL也不为empty,连续的空格也被认为是empty
  • @Range 验证对象在指定的范围内

配置:只要队被校验的meta注解Constraint

java 复制代码
public class User{
	
	@NotNull
	private String name;
}

然后Controller对应的方法中,给对应的参数@Valid注解

java 复制代码
public String doRegister(@Valid User user,BindingResult result){

	//校验没有通过
	if(result.hasErrors()){
		return "user";
	}
	if(user != null){
		userService.saveUser(user);
	}
	return "user";
}

这样就完成了针对输入数据User对象的校验了,校验结果保存在BindingResult对象中

BindingResult参数如果放在验证参数的后面,那么错误信息是会绑定到此BindingResult上的,否则会抛出MethodArgumentNotValidException异常

相关推荐
heartbeat..9 小时前
Spring MVC 全面详解(Java 主流 Web 开发框架)
java·网络·spring·mvc·web
自在极意功。10 小时前
简单介绍SpringMVC
java·mvc·springmvc·三层架构
威桑19 小时前
深入理解 MVC 模式的优缺点
系统架构·mvc
alonewolf_991 天前
Spring MVC启动与请求处理全流程解析:从DispatcherServlet到HandlerAdapter
java·spring·mvc
廋到被风吹走1 天前
【Spring】Spring MVC核心原理与RESTful最佳实践详解
spring·mvc·restful
叶落无痕521 天前
Electron应用自动化测试实例
前端·javascript·功能测试·测试工具·electron·单元测试
汽车仪器仪表相关领域1 天前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
码农水水2 天前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
卓码软件测评2 天前
CMA-CNAS软件测评报告机构【Apifox动态Mock响应处理复杂业务逻辑设计】
测试工具·性能优化·单元测试·测试用例
孙琦Ray2 天前
GitHub开源项目日报 · 2026年1月7日 · 本期热门开源全景
单元测试·开源·前端调试·浏览器自动化·知识管理·ai代理·跨语言序列化