版本:Spring 4.1.8 Spring MVC 4.1.8,Shiro 1.2.4,Junit 4.12
网上关于对Controller的测试其实挺多的,不过也挺杂乱的,遇到各种坑。
首先用到的是MockMvc这个测试框架,这个没什么好说的;
其次测试需要用户登录的session问题,因为在controller中需要验证用户的信息
controller方法中各个参数属性注解的处理,如@ModelAttribute,@RequestBody
先上一个我自己项目的单元测试框架
单元测试基类
* spring 测试基类 使用junit4进行单元测试 *
*
locations
transactionManager defaultRollback
定义一个单元测试的基类,以后其他所有测试类都要继承BaseJunit4Test
业务测试
一个简单测试实例如下:
warningController
mockMvc
mockMvc warningController
上面对应解决一般的测试问题,就已经足够了
但是涉及到验证用户信息的情况下,上面代码显然不足,运行测试会发现SessionContext must be an HTTP compatible implementation.说白了就是没有session信息,那么我没就要添加Mock的session信息
解决用户session问题
首先需要引入属性MockHttpSession属性,其次还必须有用户登录的Controller
warningController
userLogin
mockMvc
mockMvc2
session
mockMvc warningController
mockMvc2 userLogin
session
* 获取用户登录的Session
resultActions mockMvc2
resultActions
result resultActions
session result
session
上面代码中说明在做用户验证测试的时候,必须首先模拟一遍用户登录,获取到session再做后面的测试,doLogin方法只是一个测试,里面提交的具体参数需要根据实际情况post。然后继续运行后续的测试代码,还是会发现SessionContext must be an HTTP compatible implementation.异常,这个异常可以跟踪源码查找,不过这里早就有大神做了这一步了,具体可以参考Junit+Spring MockMvc+Shiro时出现SessionContext和SecurityManager的错误解决方式
这位老兄说的很明白了,就是需要手动添加shiroFilter过滤器,那么这里就把
mockMvc warningControllermockMvc2 userLogin
修改如下:
mockMvc warningController mockMvc2 userLogin
然后再测试就会发下正常了!
不过到了具体Controller方法又有问题,如下对@ModelAttribute @RequestBody的处理
Junit测试Controller(MockMVC使用),传输@ModelAttribute参数解决办法
测试方法
model
resultActions mockMvc
APPLICATION_JSON
session model
resultActions
resultActions
上面方法测试一个查询操作,其中有参数 start,limit,这两个参数用户控制分页,还有参数model,这个对象里面承载的是查询的具体条件,使用flashAttr方法,然后定义了一个“model”的名称,那么在业务Controller的查询条件中必须显式的指名@ModelAttribute的名称是”model”,否则单元测试不通过!
value DEFAULT_CURRPAGE_MODEL_KEY required defaultValue DEFAULT_PAGE_START start
value DEFAULT_PAGE_SIZE_MODEL_KEY required defaultValue DEFAULT_PAGE_SIZE limit
value model
modelMap
start limit
list warningServicemodel
modelMapDEFAULT_RECORD_MODEL_KEY list
modelMapDEFAULT_COUNT_MODEL_KEY list
modelMapDEFAULT_SUCCESS_KEY TRUE
modelMapDEFAULT_SUCCESS_KEY FALSE
modelMap
Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
关于参数是@RequestBody修饰,表明前台传来的是json串,测试模拟提交类型必须是application/json,并且使用content方法提交json内容,如下:
content
mockMvc
session
APPLICATION_JSONcontent
好了,以上就是总结的使用Spring+SpirngMVC+Shiro+Junit4单元测试Controller方法以及注意事项
还没有评论,来说两句吧...