大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
REST Assured
JUnit 断言 statusCode() 可读性差;REST Assured 提供 Given-When-Then DSL,让 HTTP 测试像写英语句子。本课为 jev-javalin / spring-boot-essentials 的 Controller 测试打样,并衔接 java-core-essentials 的 JUnit 5。
学习目标
- 用 REST Assured 发送 GET/POST 并断言状态码、Header 与 JSON body
- 提取 JSON 字段做链式断言与后续步骤参数化
- 在 Spring Boot 测试中启动随机端口并复用
@LocalServerPort
基本 DSL
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
@Test
void shouldReturnBookWhenExists() {
given()
.baseUri("http://localhost:7000")
.pathParam("isbn", "978-0134685991")
.when()
.get("/api/books/{isbn}")
.then()
.statusCode(200)
.body("isbn", equalTo("978-0134685991"))
.body("title", not(emptyString()));
}
Given 设上下文,When 发请求,Then 断言——与 BDD 场景一致。
JSON 与 Hamcrest 匹配
given()
.contentType("application/json")
.body("""
{"isbn":"978-0321356680","title":"Effective Java"}
""")
.when()
.post("/api/books")
.then()
.statusCode(201)
.body("id", greaterThan(0));
复杂结构可用 jsonPath():
String title = get("/api/books")
.then()
.extract()
.jsonPath()
.getString("find { it.isbn == '978-0134685991' }.title");
Spring Boot 集成测试
@SpringBootTest(webEnvironment = RANDOM_PORT)
class BookApiIT {
@LocalServerPort
int port;
@BeforeEach
void baseUri() {
RestAssured.port = port;
}
@Test
void createAndFetch() {
String isbn = "978-0134685991";
given().body(Map.of("isbn", isbn, "title", "Clean Code"))
.contentType(JSON)
.when()
.post("/api/books")
.then()
.statusCode(201);
get("/api/books/{isbn}", isbn)
.then()
.body("title", equalTo("Clean Code"));
}
}
无需启动 Postman;CI 里 mvn test 即可回归 API。
与 MockMvc 对比
| REST Assured | MockMvc | |
|---|---|---|
| 是否真 HTTP | 可打真实端口 | 模拟 DispatcherServlet |
| 可读性 | BDD 风格高 | 链式 .andExpect |
| 跨语言 | 仅 Java | 仅 Java |
| 测外部服务 | ✅ baseUri 指向任意 URL | ❌ 需 WireMock |
练习
- 为 jev-javalin 的 Book API 写 3 个 REST Assured 测试(200/404/201)
- 用
extract().path("id")把 POST 返回的 id 用于后续 GET - 在 Spring Boot 项目里加
@SpringBootTest集成测试,跑通mvn test
小结
REST Assured 让 API 测试像写规格说明;与 JUnit 5 组合是 Java 后端的标准姿势。 下一课用 JMeter 从「功能正确」走到「性能可接受」。