在 spring boot 3.x 的 mvc 测试里,用 mockmvc 发送模拟请求,再用 jsonpath 分别断言 json 字段和值。测试只需覆盖单个控制器时可以选用 webmvctest。

添加测试依赖
将依赖添加到已有 spring-boot-starter-web 的 Maven 项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
示例控制器和测试使用同一个 Java 包。
准备返回嵌套 JSON 的接口
将类保存为 UserController.java,并按项目实际包名调整。
package demo;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
class UserController {
@GetMapping("/users/7")
Map<String, Object> user() {
return Map.of("user", Map.of("id", 7, "name", "Lin"), "active", true);
}
}这里返回一层嵌套对象以及一个布尔字段。
断言响应状态、类型和字段
将测试保存为 src/test/java/demo/UserControllerTest.java。在项目目录执行 mvn -Dtest=UserControllerTest test。
package demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired MockMvc mvc;
@Test
void returnsExpectedFields() throws Exception {
mvc.perform(get("/users/7").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.user.id").value(7))
.andExpect(jsonPath("$.user.name").value("Lin"))
.andExpect(jsonPath("$.active").value(true));
}
}预期测试通过。若项目配置了 Spring Security,请按业务要求在测试请求中提供身份。


















