ZetCode

Spring Boot @SpringBootTest

最后修改于 2023 年 7 月 28 日

在本文中,我们描述了 @SpringBootTest 注解,并展示了如何在测试中使用它。

@SpringBootTest 注解

@SpringBootTest 是在 Spring Boot 应用程序中创建单元测试和集成测试的主要注解。该注解启用附加功能,例如自定义环境属性、不同的 Web 环境模式、随机端口、TestRestTemplateWebTestClient 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 应用程序中创建测试。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程