SpringBoot2.x系列教程77--SpringBoot中整合测试详细实现步骤

作者:一一哥

上一章节中,我带大家学习了Java中关于Test的详细内容,接下来在本节中,我带大家结合SpringBoot,再详细的学习一下测试的具体实现。

本文会从以下4个层面讲解SpringBoot中的测试功能实现

  • Service层单元测试;
  • Controller层单元测试;
  • 断言assertThat的使用;
  • 单元测试的事务回滚。

一.SpringBoot整合测试依赖的详细实现

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。




springboot项目env地址 springboot entity_springboot单元测试


2. 添加依赖包


<


3. 创建application.yml配置文件


server:


4. 创建User实体类


package


5. 创建UserRepository实体仓库


package


6. 定义Service层代码

创建UserService接口


package


定义UserServiceImpl实现类


package


7. 创建Controller接口


package


8. 创建入口类


package


9. 创建Service层的测试类

9.1 自动创建测试类

Spring Boot中的单元测试类一般都要写在src/test/java目录下,并且测试类路径应该与要测试的类路径一直。

我们可以手动创建具的体测试类,但是在IDEA这样比较智能的开发工具中,我们其实可以通过IDEA工具自动创建测试类。

如下图所示:


springboot项目env地址 springboot entity_springboot项目env地址_02


也可以通过快捷键⇧⌘T(MAC)或者Ctrl+Shift+T(Window)来创建。

我们只需要把光标定位在要测试的类中任意位置,然后通过点击Navigate-->Test按钮,或者通过快捷键,IDEA就会自动帮我们在测试目录下创建出一个对应的测试类。

如下图所示:


springboot项目env地址 springboot entity_springboot打印sql_03


可以勾选要进行测试的方法,也可以自动产生@Before与@After等测试方法。


springboot项目env地址 springboot entity_springboot test测试类_04


springboot项目env地址 springboot entity_springboot打印sql_05


9.2 测试类内容

默认情况下,会产生如下所示的测试类:


package


我们只需要在该测试类上添加@RunWith(SpringRunner.class)和@SpringBootTest注解就可以了。

9.3 UserServiceImplTest的具体实现


package


9.4 service方法具体测试

我们只需要把光标定位在要测试的方法内部,然后右键选择run执行就可以了。


springboot项目env地址 springboot entity_springboot项目env地址_06


一开始数据库中的数据如下:


springboot项目env地址 springboot entity_springboot test测试类_07


测试成功的效果:


springboot项目env地址 springboot entity_springboot项目env地址_08


此时数据库中的数据如下所示:


springboot项目env地址 springboot entity_springboot项目env地址_09


查询方法的测试效果如下:


springboot项目env地址 springboot entity_springboot项目env地址_10


当我们测试失败时的效果如下所示:


springboot项目env地址 springboot entity_springboot test测试类_11


10. 进行Controller层的测试

10.1 自动创建出Controller层测试类


springboot项目env地址 springboot entity_springboot单元测试_12


10.2 构建出MockMvc对象


package


10.3 具体测试代码实现


package


10.4 MockMvc执行解释

  • mockMvc.perform执行一个请求;
  • MockMvcRequestBuilders.get(“/user/save”)构造一个请求,Post请求就用.post方法;
  • contentType(MediaType.APPLICATION_JSON)代表发送端发送的数据格式是application/json;
  • accept(MediaType.APPLICATION_JSON)代表客户端希望接受的数据类型为application/json;
  • ResultActions.andExpect添加执行完成后的断言;
  • ResultActions.andExpect(MockMvcResultMatchers.status().isOk())方法看请求的状态响应码是否为200如果不是则抛异常,测试不通过;
  • andExpect(MockMvcResultMatchers.jsonPath("$.username").value("test2"))这里jsonPath用来获取username字段对比是否为”test2“,不是则测试不通过;
  • ResultActions.andDo添加一个结果处理器,表示要对结果做什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。

11. 完整项目结构


springboot项目env地址 springboot entity_springboot单元测试_13


springboot项目env地址 springboot entity_springboot test测试类_14


二. 断言assertThat的使用

1. assertThat断言简介

从JUnit4.4版本开始,结合 Hamcrest,提供了一个全新的断言语法——assertThat。

我们可以只使用一个assertThat断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。

2. assertThat 的基本语法:


assertThat


3. assertThat 的优点

  • 优点 1:以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了assertThat,即可以替代所有的 assertion 语句,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。
  • 优点 2:assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配准则精确的指定一些想要设定满足的条件,具有很强的易读性,而且使用起来更加灵活。
  • 优点 3:assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。
  • 优点 4:可以将这些 Matcher 匹配符联合起来灵活使用,达到更多目的。

4. 断言中的Matcher匹配符


// 想判断某个字符串 s 是否含有子字符串 "developer" 或 "Works" 中间的一个


三. 单元测试的事务回滚

我们在进行单元测试的时候,如果不想让测试数据对正式数据库,造成垃圾数据,可以开启事务功能。只需要在方法或者类上面添加@Transactional注解即可。


@RunWith


这样测试完数据就会回滚了,不会造成垃圾数据。如果你想关闭事务的回滚功能,要么不添加@Transactional注解,要么可以加上@Rollback(false)注解。

@Rollback表示事务执行完回滚,支持传入一个参数value,默认true即回滚,false不回滚。

但是如果你使用的数据库是Mysql,有时候会发现加了注解@Transactional 也不会回滚,那么你就要查看一下你的默认引擎是不是InnoDB,如果不是就要改成InnoDB。