🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
专栏名称 | 专栏介绍 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
一、快速定位问题
1. 查看详细错误日志
- 关键步骤:根据日志ID
[185c31bb]
找到完整的异常堆栈信息。 - 操作方式:
- 在日志文件中搜索
185c31bb
,定位到具体的错误位置。 - 关注
Caused by:
后的根本原因(如NullPointerException
、DatabaseConnectionException
等)。
- 在日志文件中搜索
2. 启用DEBUG日志
- Spring Boot配置:在
application.properties
或application-test.properties
中增加:logging.level.root=DEBUG logging.level.org.springframework.web=DEBUG logging.level.your.package=TRACE
- 目的:获取更详细的请求处理流程和异常信息。
二、常见原因及解决方案
1. 代码逻辑错误
- 典型问题:
- 控制器(
@RestController
)中未处理的异常。 - 服务层返回
null
或未校验数据合法性。
- 控制器(
- 排查方法:
- 检查控制器方法是否添加了
@ExceptionHandler
或全局异常处理(@ControllerAdvice
)。 - 在测试中打印响应体,确认错误信息:
webTestClient.get().uri("/api/endpoint") .exchange() .expectStatus().isOk() .expectBody(String.class).consumeWith(System.out::println);
- 检查控制器方法是否添加了
2. 依赖组件未正确注入
- 典型问题:
- 测试环境未正确初始化Bean(如数据库连接、缓存、第三方服务)。
- 使用
@MockBean
但未定义Mock行为。
- 解决方案:
- 确保测试类添加了
@SpringBootTest
或@WebFluxTest
注解。 - 如果使用Mock,需明确指定Mock行为:
@MockBean private UserService userService; @BeforeEach void setup() { Mockito.when(userService.findById(any())).thenReturn(Mono.just(new User())); }
- 确保测试类添加了
3. 数据库或外部服务问题
- 典型问题:
- 数据库迁移脚本未执行(如Liquibase/Flyway)。
- 测试数据库表结构或测试数据不匹配。
- 操作步骤:
- 检查测试数据库是否已应用最新的迁移脚本。
- 在测试前初始化数据:
@Test void testEndpoint() { // 初始化测试数据 databaseClient.insert().into(User.class).using(new User("test")).then().block(); // 执行测试 webTestClient.get().uri("/api/users/test") .exchange() .expectStatus().isOk(); }
4. 请求/响应序列化问题
- 典型问题:
- 请求体(
@RequestBody
)或路径变量类型不匹配。 - 响应体包含无法序列化的对象(如循环引用)。
- 请求体(
- 排查方法:
- 检查接口定义的参数类型是否与请求匹配。
- 在测试中明确指定请求内容类型:
webTestClient.post().uri("/api/create") .contentType(MediaType.APPLICATION_JSON) .bodyValue("{ \"name\": \"test\" }") .exchange() .expectStatus().isOk();
5. 安全配置冲突
- 典型问题:
- 未禁用CSRF保护导致POST请求被拒绝。
- 测试用户未通过认证/授权。
- 解决方案:
- 在测试配置中禁用安全链:
@TestPropertySource(properties = { "spring.security.enabled=false" })
- 或模拟认证用户:
webTestClient.get().uri("/api/secured") .headers(headers -> headers.setBearerAuth("mock-token")) .exchange() .expectStatus().isOk();
- 在测试配置中禁用安全链:
三、高级调试技巧
1. 断点调试
- 步骤:
- 在控制器方法入口处设置断点。
- 在服务层和Repository层的关键逻辑处设置断点。
- 使用IDE的调试模式运行测试,逐步跟踪请求处理流程。
2. 网络请求抓包
- 工具:使用
Wireshark
或tcpdump
抓取测试请求的原始数据。 - 目的:确认请求是否按预期发送,响应是否包含隐藏错误信息。
3. 隔离测试环境
- 操作:
- 单独运行该测试方法,排除其他测试的干扰:
./mvnw test -Dtest=YourTestClass#testSpecificMethod
- 单独运行该测试方法,排除其他测试的干扰:
四、代码示例:修复常见问题
场景:控制器返回未处理的 Mono.error
@GetMapping("/error-prone")
public Mono<String> errorProneEndpoint() {
return Mono.error(new RuntimeException("Simulated error"));
}
修复方案:添加全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
return ResponseEntity.status(500).body("Error: " + ex.getMessage());
}
}
测试代码验证:
webTestClient.get().uri("/error-prone")
.exchange()
.expectStatus().is5xxServerError()
.expectBody().jsonPath("$.error").isEqualTo("Simulated error");
五、总结步骤
- 查日志:定位日志ID
[185c31bb]
的详细错误。 - 简化测试:注释掉非关键代码,逐步缩小问题范围。
- 验证依赖:检查数据库、外部服务、安全配置。
- 调试代码:通过断点和日志确认业务逻辑正确性。
- 修复并重试:根据错误原因调整代码或配置,重新运行测试。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙