在 java 单元测试中,使用 testresttemplate 测试 http 接口的核心做法是将其注入到测试类中,直接发起真实的 http 请求并验证响应。通过构造具体的输入参数(如 url、请求体)调用接口,获取 responseentity 对象后,断言状态码和返回内容是否符合预期。

如何配置 TestRestTemplate 以支持自定义端口?
当测试的 Spring Boot 应用运行在非默认端口或随机端口时,必须确保 TestRestTemplate 能够正确连接到该实例。可以通过构造函数传入 RestTemplateBuilder 来配置连接超时等细节,或者直接使用 @LocalServerPort 注解自动获取应用启动的实际端口号,从而构建正确的请求地址。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@LocalServerPort
private int port;
@Test
void testGetUser() {
String url = "http://localhost:" + port + "/api/users/1";
ResponseEntity<string> response = restTemplate.getForEntity(url, String.class);
System.out.println(response.getBody());
}
}</string>
如何验证 POST 请求的请求体和响应结构?
对于需要发送 JSON 数据的 POST 请求,可以将 Java 对象序列化为 JSON 字符串作为请求体。调用 postForEntity 方法后,解析返回的 ResponseEntity,检查其状态码是否为 200 或 201,并验证返回的 JSON 字段是否与预期一致。这种方式能完整覆盖从请求构造到响应解析的全流程。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import com.fasterxml.jackson.databind.ObjectMapper;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerPostTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
void testCreateUser() throws Exception {
UserDto user = new UserDto("Alice", 25);
ObjectMapper mapper = new ObjectMapper();
String jsonInput = mapper.writeValueAsString(user);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<string> entity = new HttpEntity(jsonInput, headers);
ResponseEntity<string> response = restTemplate.exchange(
"/api/users", HttpMethod.POST, entity, String.class);
System.out.println(response.getBody());
}
}</string></string>
当接口返回 404 时 TestRestTemplate 会抛出异常吗?
默认情况下,如果 HTTP 接口返回 4xx 或 5xx 错误状态码,TestRestTemplate 不会抛出异常,而是将错误信息封装在 ResponseEntity 中返回。开发者可以直接检查 response.getStatusCode().is4xxClientError() 来确认是否发生了客户端错误,从而进行针对性的断言验证。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











