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异常

相关推荐
汽车仪器仪表相关领域31 分钟前
ZDT-III 通用电机测试系统
数据库·算法·单元测试·压力测试·可用性测试
阿拉斯攀登1 小时前
设计模式:Spring MVC 中命令模式的核心映射与设计逻辑
spring·设计模式·mvc·命令模式
七夜zippoe2 小时前
Spring MVC请求处理流程源码分析与DispatcherServlet核心逻辑
java·spring·mvc·过滤器·拦截器
凌乱风雨12112 小时前
Java单元测试、集成测试,区别
java·单元测试·集成测试
0和1的舞者16 小时前
《软件测试分类指南:8 大维度 + 核心要点梳理》
java·软件测试·单元测试·测试·黑盒测试·白盒测试·测试分类
卓码软件测评1 天前
CMA/CNAS软件测评机构:【Gatling XPath检查:XPath语法在XML响应中的应用】
测试工具·单元测试·测试用例
汽车仪器仪表相关领域1 天前
ZRT-I 精密减速器测试系统
大数据·运维·功能测试·安全·单元测试·负载均衡·压力测试
川石课堂软件测试1 天前
软件测试的白盒测试(二)之单元测试环境
开发语言·数据库·redis·功能测试·缓存·单元测试·log4j
while(1){yan}1 天前
Spring MVC请求基础
java·spring·mvc
renke33642 天前
Flutter 2025 测试工程体系:从单元测试到混沌演练,构建高可靠、可验证、自动化的质量保障闭环
flutter·单元测试·自动化