Spring Boot单元测试(Mock)
Spring Boot单元测试(Mock)
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)的更多相关文章
- Spring Boot 单元测试示例
Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启 ...
- Spring Boot 单元测试详解+实战教程
Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块. spring-boot-test:支持测试的核心内容. spring-b ...
- spring /spring boot中mock
1 Mockito简介 1.1 Mockito是什么 Mockito是一个简单的流行的Mock框架.它允许你创建和配置mock对象.使用Mockito可以明显的简化对外部依赖的测试类的开发.一般使 ...
- 48. spring boot单元测试restfull API【从零开始学Spring Boot】
回顾并详细说明一下在在之前章节中的中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...
- IDEA + Spring boot 单元测试
1. 创建测试类 打开IDEA,在任意类名,任意接口名上,按ctrl+shift+t选择Create New Test image 然后根据提示操作(默认即可),点击确认,就在项目的/test/jav ...
- spring boot 单元测试,如何使用profile
一.问题概述 spring boot项目.单元测试的时候,我发现,总是会使用application.properties的内容,而该文件里,一般是我的开发时候的配置. 比如上图中,dev是开发配置,p ...
- Java程序员的日常—— Spring Boot单元测试
关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等 ...
- spring boot单元测试(转)
Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. ...
- spring boot 单元测试 --- 在测试类使用 javabean注解操作接口
1.依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
随机推荐
- node.js上除了Express还有哪些好用的web开发框架
老司机都有体会, 开发本身没有多难, 最纠结其实是最初的技术和框架选型, 本没有绝对的好坏之分, 可一旦选择了不适合于自己业务场景的框架, 将来木已成舟后开发和维护成本都很高, 等发现不合适的时候更换 ...
- Python tkinter调整元件在窗口中的位置与几何布局管理
Tkinter中的GUI总是有一个root窗口,不管你是主动或者别动获得.主窗口就是你的程序开始运行的时候创建的,在主窗口中你通常是放置了你主要的部件.另外,Tkinter脚本可以依据需要创建很多独立 ...
- Cookie同域,跨域单点登录
Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...
- java反射获取字段的属性值,以及为字段赋值等方法
1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...
- Linux文件类型介绍
文件类型介绍: Linux系统不同于Windows系统,两者文件类型和文件扩展名也有很大的差异.Linux中的文件类型和Linux文件的文件扩展名所代表的意义和Windows系统完全不同.用户一般通过 ...
- 初学者易上手的SSH-struts2 05拦截器与自定义拦截器
因为自己对于struts2也不是很了解,这章将是struts2的最后一章了.那么这一章主要介绍的是拦截器以及怎么样来自定义一个拦截器. struts2的拦截器位于struts2-core(核心包)-& ...
- SSM框架整合项目 :投票系统
框架: Spring SpringMVC MyBatis 题目: 投票系统 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastjson 5, aspe ...
- Mybatis的parameterType传入多个参数
如果查询的条件有多个的时候,mybatis有三种传入方式: 1.通过注解传入 例如: public interface Mapper(){ public User login(@Param(" ...
- 【特效】单选按钮和复选框的美化(只用css)
表单的默认样式都是比较朴素的,实际页面中往往需要美化他们.这里先说说单选按钮和复选框,有了css3,这个问题就变的好解决了.利用input与label相关联,对label进行美化并使其覆盖掉原本的in ...
- 学习flex布局(弹性布局)
Flex是Flexible Box的缩写,意为弹性布局.是W3C早期提出的一个新的布局方案.可以便捷的实现页面布局,目前较高版本的主流浏览器都能兼容,兼容情况如下: Flex在移动端开发上已是主流,比 ...