Spring Boot @SpringBootTest
最后修改于 2023 年 7 月 28 日
在本文中,我们描述了 @SpringBootTest 注解,并展示了如何在测试中使用它。
@SpringBootTest 注解
@SpringBootTest 是在 Spring Boot 应用程序中创建单元测试和集成测试的主要注解。该注解启用附加功能,例如自定义环境属性、不同的 Web 环境模式、随机端口、TestRestTemplate 和 WebTestClient beans。
示例应用程序
在下面的应用程序中,我们创建了一些使用 @SpringBootTest 的测试方法。我们将要测试 home 控制器。
build.gradle
...
src
├── main
│ ├── java
│ │ └── com
│ │ └── zetcode
│ │ ├── Application.java
│ │ └── controller
│ │ └── HomeController.java
│ └── resources
│ └── templates
│ └── index.ftlh
└── test
├── java
│ └── com
│ └── zetcode
│ └── controller
│ └── HomeControllerTest.java
└── resources
这是项目结构。
build.gradle
plugins {
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}
group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
这是 Gradle 构建文件。 spring-boot-starter-test 在 Spring 中添加了测试支持。 useJUnitPlatform 方法指定应使用 JUnit 平台来发现和执行测试。
com/zetcode/controller/HomeController.java
package com.zetcode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.time.LocalDate;
import java.util.HashMap;
@Controller
public class HomeController {
@RequestMapping(path = "/")
public ModelAndView index() {
var params = new HashMap<String, String>();
var today = LocalDate.now();
var dayOfWeek = today.getDayOfWeek().toString().toLowerCase();
params.put("dow", dayOfWeek);
return new ModelAndView("index", params);
}
}
我们有一个简单的 HomeController,它将当前星期几发送到视图。
resources/templates/index.ftlh
<!DOCTYPE html>
<html lang="en">
<head>
<title>Cities</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<p>
Hello there! Today is ${dow}.
</p>
</body>
</html>
视图显示问候语和星期几。
com/zetcode/Application.java
package com.zetcode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Application 是设置 Spring Boot 应用程序的入口点。
com/zetcode/controller/HomeControllerTest.java
package com.zetcode.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import java.time.LocalDate;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
class HomeControllerTest {
@Autowired
private HomeController controller;
@Autowired
private MockMvc mockMvc;
@Test
public void contextLoads() throws Exception {
assertThat(controller).isNotNull();
}
@Test
public void testHome() throws Exception {
this.mockMvc.perform(get("/"))
.andDo(print())
.andExpect(status().isOk());
}
@Test
public void testHelloMessage() throws Exception {
var today = LocalDate.now();
var dayOfWeek = today.getDayOfWeek().toString().toLowerCase();
var expected = String.format("Hello there! Today is %s", dayOfWeek);
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString(expected)));
}
}
在 HomeControllerTest 中,我们有三个测试方法。
@SpringBootTest
@AutoConfigureMockMvc
class HomeControllerTest {
该类使用 @SpringBootTest 和 @AutoConfigureMockMvc 进行注解。后者模拟了 Web 层。
@Test
public void contextLoads() throws Exception {
assertThat(controller).isNotNull();
}
我们确保控制器已加载。
@Test
public void testHome() throws Exception {
this.mockMvc.perform(get("/"))
.andDo(print())
.andExpect(status().isOk());
}
在此方法中,我们测试响应状态码。
@Test
public void testHelloMessage() throws Exception {
var today = LocalDate.now();
var dayOfWeek = today.getDayOfWeek().toString().toLowerCase();
var expected = String.format("Hello there! Today is %s", dayOfWeek);
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString(expected)));
}
最后,我们测试响应的内容。
$ ./gradlew test --info
我们运行测试。
在本文中,我们展示了如何使用 @SpringBootTest 在 Spring Boot 应用程序中创建测试。