Spring Boot单元测试(Mock)

Java个人学习心得 2017-08-12 16:07

Mock

单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详情可参看《Spring boot+MyBatis+PageHelper+JSON》),现在写一下Spring Boot下怎么测试Controller、Service。

Controller测试

本文就简单一点,写一个Hello接口。

Controller

HTTP请求测试:

既然是测试Controller接口,肯定就是发送HTTP请求了,之前的文章我也有提到,可以使用Postman、Swagger进行测试,本文我们采用编码的方式测试,新建HttpRequestTest类:

HTTP测试类

注意三个红框,这是告诉Spring Boot启动的时候采用一个随机的端口,有助于在测试环境中避免冲突(官网解释)。

绿框的restTemplate,看过之前我的《Spring Cloud网关与负载均衡Zuul与Ribbon》就知道,与RestTemplate差不多,这就是个HTTP客户端。

运行测试通过。注意看日志,会找到一行日志:

Tomcat started on port(s):XXXXX

这说明整个Tomcat已经启动成功了。

MockMVC测试:

注意上面的测试,通过日志我们知道,其实就是启动了Tomcat,然后通过TestRestTemplate构建了HTTP请求。但是在我们实际开发中,有一个现实的问题,我们一个工程会有很多的Controller、Service、Mapper,但是我们本次测试可能就测一个接口。为了一个接口,要启动整个Tomcat,太浪费了。所以我们可以采用MockMVC,在不启动的服务的情况下,测试接口:

Mock测试

实际开发中,肯定会有很多Controller,红框内我们指定本次测试只实例化HellController这一个。

另外在开发的时候,Eclipse没法通过快捷键进行import static,所以我们要手工导入以下:

导入

运行本测试,注意看日志,就不会出现Tomcat started on port(s):XXXXX的记录了。

Service测试

在实际开发中,Service的逻辑处理比较多,应该是最先被测试的,本示例增加一个Service和Mapper,如下:

Mapper

在我之前那个完整的工程中,这个注解应该是@Mapper,本例我没引入数据库,只是模拟一下,所以用了@Repository。

Service

在@Service下应该还有事务注解@Transactional,本例只是模拟,所以也没有加。

测试类如下:

测试类

注意红框,在实际开发中,我们自己写的Controller、Service很可能去调用别的同事或别的项目组写的Service、Mapper,对方可能只写了一个接口,没有实现(比如本例中我写的Mapper),这样是没法进行测试的。

Mock的作用就是创建一个虚拟的对象替代那些不易构造或不易获取的对象。

本例中我都没有引入数据库的相关依赖,本来应该是连接数据库的Mapper,现在就是一个单纯的接口,如果不对Mapper进行处理,这个测试就没法进行下去。

于是在第一个红框内Mock了一个HelloMapper,第二个红框对这个Mock对象的方法进行了处理,等于Mapper接收参数“leo”,返回结果“Hello leo”,给Service使用。

运行测试通过。

Controller测试(含Service)

在“MockMVC测试”一节中,我们只测了Controller里的一个方法,没有引入Service,这在实际工作中是不可能的,我们要么引入自己写的Service,要么引入其他同事写的Service(接口形式),如果这时候引入的Service同样没有实现,这测试也没法做下去。结合“Service测试”的内容,我们可以这么做:

Controller

Controller新增一个方法,调用了Service。

测试类

测试类增加如上代码,Mock一个假的Service,用when来处理Service,用MockMVC模拟HTTP请求,测试通过。

Spring Boot单元测试(Mock)的更多相关文章

  1. Spring Boot 单元测试示例

    Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...

  2. Spring Boot 单元测试详解+实战教程

    Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块. spring-boot-test:支持测试的核心内容. spring-b ...

  3. spring /spring boot中mock

    1 Mockito简介 1.1 Mockito是什么   Mockito是一个简单的流行的Mock框架.它允许你创建和配置mock对象.使用Mockito可以明显的简化对外部依赖的测试类的开发.一般使 ...

  4. 48. spring boot单元测试restfull API【从零开始学Spring Boot】

    回顾并详细说明一下在在之前章节中的中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...

  5. IDEA + Spring boot 单元测试

    1. 创建测试类 打开IDEA,在任意类名,任意接口名上,按ctrl+shift+t选择Create New Test image 然后根据提示操作(默认即可),点击确认,就在项目的/test/jav ...

  6. spring boot 单元测试,如何使用profile

    一.问题概述 spring boot项目.单元测试的时候,我发现,总是会使用application.properties的内容,而该文件里,一般是我的开发时候的配置. 比如上图中,dev是开发配置,p ...

  7. Java程序员的日常—— Spring Boot单元测试

    关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等 ...

  8. spring boot单元测试(转)

    Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. ...

  9. spring boot 单元测试 --- 在测试类使用 javabean注解操作接口

    1.依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...

随机推荐

  1. 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖

    1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.   Input 第1行:一个 ...

  2. ARCGIS切图:TPK文件的空间参考为地理坐标系

    先来吐槽一下,之前习惯了百度地图API,所以一直习惯直接将经纬度点添加到地图上进行显示,目前使用ARCGIS RUNTIME FOR ANDROID进行开发,在地图上加点需要原始点的坐标为投影坐标系, ...

  3. Java历程-初学篇 Day07 循环结构2 for循环

    一,格式 for(赋值语句//为循环变量赋初值;条件语句//循环结构的循环条件;赋值语句//迭代,修改循环变量的值){ //循环体; } 二,简单举例 for(int i=1;i<=10;i++ ...

  4. Linux安装mysql-5.7.17

    一.检查系统是否有自带安装MySQL 1.检查 [root@centos ~]# rpm -qa | grep -i mysql mysql-libs-5.1.71-1.el6.x86_64 2.卸载 ...

  5. ZOJ1654 Place the Robots

    Zoj1654 标准解法:二分匈牙利. 写法各异嘛,看不懂或者懒得看也正常,如果想了解我思路的可以和我讨论的. 在练习sap,所以还是写了一遍: #include<cstdio> #inc ...

  6. python apschedule安装使用与源码分析

    我们的项目中用apschedule作为核心定时调度模块.所以对apschedule进行了一些调查和源码级的分析. 1.为什么选择apschedule? 听信了一句话,apschedule之于pytho ...

  7. 浅谈script标签中的async和defer

    script标签用于加载脚本与执行脚本,在前端开发中可以说是非常重要的标签了.直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染 ...

  8. [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件

    这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...

  9. MS-DOS命令dir命令详细解析

    DOS命令窗口打开方式为Win+R键,打开运行命令,输入 cmd 即可:特殊情况我们要用管理员身份运行DOS,此时就可以在开始菜单-附件-DOS命令,鼠标右键单击命令提示符以管理员身份运行.如果是wi ...

  10. CMD(SA400 Command)

    一.CMD模糊查询: 命令行键入:CRT,WRK,ADD,CPY,DSP,CHG,CLR,FND,RTV*等. 二.CMD分类查询: 命令行键入:GO CMD xxx eg:GO CMD FILE,G ...