Yuque Archive
寻常的路

Spring Boot中的单元测试

参考:《Microservices with Spring Boot》(Chapter 1)

从配置文件开始

之前都是使用Spring Initializr构建项目,直接复制build.gradle文件的内容。这次新建一个Maven项目,从配置文件开始写起。

配置starter-parent

编辑pom.xml文件,首先配置spring-boot-starter-parent

为什么需要spring-boot-starter-parent

因为spring-boot-starter-parent配置了默认使用的Java版本,以及默认使用的Spring Boot版本,还有默认的Maven插件配置。

配置其它starter

这里需要引入三个starter依赖:

  • spring-boot-starter-web用于构建包含RESTFul功能的Web应用,基于SpringMVC,默认使用tomcat作为嵌入的容器,并且提供很多自动的配置
  • spring-boot-starter-tomcat提供Web容器
  • spring-boot-starter-test提供多个测试框架的集合,包括JUnitMockitoHamcrest, AssertJSpring Test

pom.xml中添加代码:

配置Maven插件

我们在使用Spring Boot构建应用的时候,可能会需要这样的功能:

  • 不编译生成JARWAR文件就可以启动、运行应用
  • 开发结束之后可以编译生成JARWAR文件

spring-boot-maven-plugin依赖就为应用提供了这样的能力,将其添加到pom.xml

编写控制器

控制器之前已经写过,这里写个更简单的,之后用测试类来验证它的正确性。

应用运行类:

arc/main/java/com/mastering/spring/springboot/Application.java

单是这个文件,应用就可以启动了。

写一个控制器:

arc/main/java/com/mastering/spring/springboot/controller/BasicController.java

当访问 https://localhost:8080/welcome ,页面会输出"Hello World!",这里没有用到POJO类,比一开始的Guides还要简单。

可以启动应用,访问路径试试是否成功。

单元测试

测试类:

src/test/java/com/mastering/spring/springboot/controller/BasicControllerTest.java

把导包的路径都贴了出来,因为equalTo()方法在导包的时候容易出错。

关于这个测试文件:

  • @RunWith():SpringRunner是一个SpringJUnit4ClassRunner简写的注解,会启动一个简单的单元测试上下文环境。

  • @WebMvcTest():这个注解用于写一些简单的Spring MVC控制器测试,它只加载和Spring MVC注解相关的beans。

  • @Autowired private MockMvc mvc:这个自动装配的bean可用于发送接收请求:

  • perform()会发送一个指向/welcome的请求

  • accept()设置请求头类型值为application/json

  • andExpect()判断返回状态是否为200

  • andExpect(content().string(equalTo("Hello World")))判断返回内容是否为Hello World

集成测试

集成测试是单元测试的扩展,我们做测试的时候会希望运行所有控制器。

src/test/java/com/mastering/spring/springboot/controller/BasicControllerTest.java

关于这个测试文件:

  • @SpringBootTest():提供了Spring测试上下文环境,支持对运行的容器配置端口。
  • @LocalServerPort:测试程序需要知道当前容器运行在哪个端口
  • private TestRestTemplate template:在测试方法中使用,上面的代码中它向/welcome发送了get请求
  • assertThat():断言