SuperAPI AI 工具集

unit-test-application-events

测试与质量

查看项目

更新于 10-15 21:52

技能介绍

用途:为 Spring 的 ApplicationEvent 发布者与 @EventListener 消费者编写单元测试,基于 JUnit 5 和 Mockito,无需启动完整 Spring 上下文。

主要能力:验证事件是否以正确负载发布;测试 @EventListener 方法调用与副作用;测试事件在多个监听器间的传播;验证异步事件处理(@Async + @EventListener);在服务测试中模拟 ApplicationEventPublisher。

使用方式:添加 spring-boot-starter、JUnit 5、Mockito、AssertJ 依赖(Maven 或 Gradle)。用 @Mock 模拟 ApplicationEventPublisher,用 ArgumentCaptor.forClass(EventType.class) 捕获事件并检查负载;直接以模拟依赖构造监听器并调用处理方法验证副作用;异步处理可用 Thread.sleep() 或 Awaitility 等待后断言。

验证检查点:捕获事件后先确认 eventCaptor.getValue() 非空再断言字段;若监听器未被调用,验证 publishEvent() 以正确事件类型被调用;异步断言失败时增加等待时间并检查执行器池是否饱和。

限制与警告:不要测试 Spring 自身事件基础设施,聚焦业务逻辑与事件负载;@Async 需要 @EnableAsync,使用 Thread.sleep 的测试即使异步代理未接入也可能通过,应改用 mock 验证;Spring 不保证监听器顺序,除非加 @Order,否则不要编写依赖执行顺序的测试;避免在 CI 中使用 Thread.sleep(),改用 Awaitility 的 .atMost() 块;跨 JVM 边界的事件需要序列化测试,远程监听器字段为 null 常意味着缺少 Serializable。

适用场景:Spring 服务中事件发布与监听逻辑的隔离单元测试。