springboot2+junit5+MockMvc(Mockito)实现对Controller的测试,配置都有,很详细了。
背景:
今天偶然想测试下每个接口是否可以访问,网上找了一堆,基本没有一个在我的环境上实现了,没有一篇文章有详细的配置,于是只能用作参考自己进行琢磨,最后就出现了这样的文章也是给各位参考了,哈哈哈。
配置:
1. springboot2
2.spring-boot-starter-test
springboot2里面的这个变成了junit5,并不是junit4,注解有些不同,具体区别参考:https://blog.csdn.net/u010675669/article/details/86574956,注释掉的代码就是去掉junit5,版本也是2.2.5
最明显的标志应该就是引用的包不同,@Test注解引用的时候不要错了。
junit5: org.junit.jupiter.api
junit4: org.junit.
3.数据源(两种:一种是hikari,springboot默认 一种是druid,阿里巴巴的)
3.1 hikari,pom没查到版本,只能xml看了。
3.2 druid
注意一点,一定要加上配置
不只是就会报空指针错误,下图,挺明显的。
用默认的就注释掉druid这个,要不即使你配置了hikari,最后你会发现数据源还是druid,一开始我用的druid,想切换到hikari看看效果,结果怎么都是测试通过。要不是巧合去看日记也不会知道用的是druid数据源,也就不会有这个发现了。
注意:如果不是配置文件写的,是代码里写的要区别数据源。
hikari 是 DataSourceBuilder
druid 是 DruidDataSourceBuilder
如果实在不知道用了哪个就看启动日记。应该在前面一点就能看到了,我的在11行左右
4. Controller类
网上看的资料两种注解都有@RestController或者@Controller,测试了下都可以,我以@Controller为例。
@Controller
@RequestMapping("/user")
public class UserController {.....@ResponseBody@PostMapping("/login")public Result login(@Valid Info info) {.....}
}
5. Test类
//个别引入的包
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
//这里配置文件没找到,估计是test的自启动里面就引入了的,查看了下版本org.springframework:spring-test:5.2.4.RELEASE
import org.springframework.mock.web.MockHttpSession;
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.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;//网上都是没有classes,但是我会报错。必须引入classes,且classes值不能乱写,要是你的springboot工程的启动类,要不没有后面MockMvc会报获取,不到请求URL的错误,即使你后台单独启动了springboot的项目。@SpringBootTest(classes={PpSystemApplication.class})//启动整个springboot工程//这个看名字就知道是自动MockMvc的了。开启后还要添加@Autowired自动注入
@AutoConfigureMockMvc
class UserControllerTest {private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);// 网上有这种形式创建MockMvc的,结果我怎么都不行,这里也写出来
// 编辑一下,用这种方法的是用junit4的。
// @Autowired
// private WebApplicationContext webApplicationContext;@Autowiredprivate MockMvc mvc;private MockHttpSession session;//junit5要用@BeforeEach,不是@Before@BeforeEachpublic void setupMockMvc(){// mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
// mvc = MockMvcBuilders.standaloneSetup(new WebController()).build();session = new MockHttpSession();}@Testvoid login() throws Exception {Info info= new Info();info.setUserName("admin");info.setPassword("admin");//请求路径不要错了MvcResult mvcResult = (MvcResult) mvc.perform(MockMvcRequestBuilders.post("/user/login").accept(MediaType.ALL).session(session)//这里要特别注意和content传参数的不同,具体看你接口接受的是哪种.param("userName",info.getUserName()).param("password",info.getPassword())//传json参数,最后传的形式是 Body = {"password":"admin","userName":"admin"}//.content(JSON.toJSON(info).toString().getBytes()) ).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();//得到返回代码int status = mvcResult.getResponse().getStatus();//得到返回结果String content = mvcResult.getResponse().getContentAsString();LOGGER.info(content);}}
配置好后,控制台可以看到的结果就是
MockHttpServletRequest:HTTP Method = POSTRequest URI = /user/loginParameters = {userName=[admin], password=[admin]}Headers = [Accept:"*/*"]Body = nullSession Attrs = {uid=1, companyId=1, roles=[RoleDO(super=BaseEntity(id=1, createTime=null, updateTime=null, remark=超级管理员 权限最高), name=超级管理员, uid=null), RoleDO(super=BaseEntity(id=2, createTime=null, updateTime=null, remark=null), name=主管, uid=null), RoleDO(super=BaseEntity(id=3, createTime=null, updateTime=null, remark=null), name=采购员, uid=null)], org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY=true, org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY=admin, org.apache.shiro.web.session.HttpServletSession.HOST_SESSION_KEY=localhost, username=隔壁老王}Handler:Type = com.heyjude.controller.UserControllerMethod = com.heyjude.controller.UserController#login(LoginCheck)Async:Async started = falseAsync result = nullResolved Exception:Type = nullModelAndView:View name = nullView = nullModel = nullFlashMap:Attributes = nullMockHttpServletResponse:Status = 200Error message = nullHeaders = [Set-Cookie:"rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT", Content-Type:"application/json"]Content type = application/jsonBody = {"code":200,"message":"SUCCESS","data":null}Forwarded URL = nullRedirected URL = nullCookies = [[MockCookie@656ec00d name = 'rememberMe', value = 'deleteMe', comment = [null], domain = [null], maxAge = 0, path = '/', secure = false, version = 0, httpOnly = false]]
OK,到此为止。
springboot2+junit5+MockMvc(Mockito)实现对Controller的测试,配置都有,很详细了。相关推荐
- SpringBoot通过WorkBook快速实现对Excel的导入和导出(包括数据校验)
之前转载过一篇对Excel基本操作相关的文章,这篇文章的浏览量迅速飙升,以至于在我博客的热门文章中排到了第三的位置,不过那篇转载的文章实用性差并且讲解不是很清晰,所以打算趁着今天休息,写一篇关于Spr ...
- java iris_利用K-Means聚类算法实现对iris.data.ulab
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...
- C#代码实现对Windows凭据的管理
今天有个任务,那就是使用C#代码实现对windows凭据管理的操作. 例如:向windows凭据管理中添加凭据.删除凭据以及查询凭据等功能. 于是乎,就开始在网上查找.经过漫长的查询路,终于在一片英文 ...
- 51单片机实现对24C02进行页写、顺序读取并显示验证
源:51单片机实现对24C02进行页写.顺序读取并显示验证 //******************************************************************** ...
- 通过memcached来实现对tomcat集群中Session的共享策略 .
近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能. 但是实现了该集群后,发现登陆系统后,每次都会被拦截回登录页面,造成该现象的原因是Session ...
- maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...
标签: 本篇内容还是建立在上一篇Java Web学习系列--Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Ja ...
- Note:HTTP服务器是如何实现对PHP支持的
目前各种服务器HTTP Server对PHP的支持一共有三种: 通过HTTP Server内置的模块来实现,例如Apache的mod_php5,类似的Apache内置的mod_perl可以对perl支 ...
- java实现对HDFS增删改查(CRUD)等操作
实现对HDFS增删改查CRUD等操作 1 查找 列出某个目录下的文件名称,hdfs命令如下所示: hdfs dfs –ls/usr/app java代码片段: [plain] view plain c ...
- 修改html时webpack热更新,利用webpack实现对html文件的热更新
webpack中webpack-dev-server是一个简单的web服务器,能够帮助咱们实现代码的热更新,即在实际开发中只需保存修改完后的代码,不用手动刷新页面就能够看到效果.在使用webpack- ...
最新文章
- 二阶系统阶跃响应实验_自控原理二阶系统阶跃响应及性能分析实验报告
- 利用BIOS 中断INT 0x10显示字符和字符串
- python免安装版_web.py入门01——python安装
- 终于搞定T43上的Access Connection了!
- GitHub上IOS开源项目
- noi linux,NOI Linux使用教程(基础讲解)
- masOS上使用Java 3D解决方案
- catia二次开发:人机交互select,start command
- Bugly使用及APP版本更新
- nodejs获取当前连接的网络ip
- 利用排序规则特点计算汉字笔划和取得拼音首字母
- SpringBoot打成jar包部署,Excel模板下载文件损坏,提示恢复问题处理
- 初学CAD,有哪些可以帮助学习的CAD快捷键?
- 微信小程序之个人中心静态页面
- mysql内存回收_mysql占用内存过多
- 如何使用脚本编辑器为您的Google Apps增压
- 云场景实践研究第50期:咕咚
- 使用mongodump和mongostore对mongodb数据库迁移实践总结
- 沙发的故事——人才的价值在于贡献度?
- 连接串口_交换机和工业串口服务器有哪些区别
热门文章
- Visual studio 2015 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
- [职场技巧第一期]面试前需弄明白的四个问题
- mybatis查询记录条数
- python表达式3or5的值为_表达式 3 or 5 的值为
- 计算机串口连接原理,串口通信的原理及USB转串口通信
- vue前端导出excel,js-xlsx、xlsxStyle,可设置样式、表格合并;(包含获取excel列数函数、excel合并表格缺少边框处理函数)
- 机器学习-查准率、查全率、调和平均值
- Delphi 获取菜单高度、标题栏高度、边框高度函数GetSystemMetrics
- nl-mean程序下载_将MEAN应用程序部署到Amazon EC2(第1部分)
- Unreal Engin_画廊制作笔记 _005灯光处理,平行光的设置