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提供多个测试框架的集合,包括JUnit、Mockito、Hamcrest, AssertJ和Spring Test。
在pom.xml中添加代码:
配置Maven插件
我们在使用Spring Boot构建应用的时候,可能会需要这样的功能:
- 不编译生成
JAR或WAR文件就可以启动、运行应用 - 开发结束之后可以编译生成
JAR和WAR文件
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/jsonandExpect()判断返回状态是否为
200andExpect(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():断言