You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus Mailer Mock测试时无法接收邮件问题排查

问题根源

你遇到的核心问题是测试进程与开发模式运行的应用进程完全隔离,导致两者使用的MockMailboxImpl实例完全独立。当你先启动Quarkus开发模式(quarkus dev),再运行@QuarkusTest测试时,测试会单独启动一个全新的应用实例,和开发模式的进程没有共享任何内存或Bean实例,自然拿不到开发模式进程中发送的邮件。

解决方案

1. 停止开发模式进程,直接运行测试

不要同时运行quarkus dev和QuarkusTest测试:

  • 关闭正在运行的Quarkus开发模式进程
  • 在IDE中直接运行你的GraphQLTests测试类,或者使用Maven/Gradle命令启动测试:
    # Maven
    mvn quarkus:test
    # Gradle
    ./gradlew quarkusTest
    

这种方式下,测试会启动专属的应用实例,MockMailbox与服务端代码处于同一个上下文,发送的邮件会直接进入测试注入的MockMailbox实例中。

2. 确保测试请求发送到测试实例的端口

如果你的测试是手动构造HTTP请求(而非使用QuarkusTest集成的RESTAssured),务必确认请求的端口是测试实例的端口(默认是8081,可通过quarkus.http.test-port配置),而非开发模式的默认端口8080。

3. 验证依赖配置

检查项目构建文件(pom.xml或build.gradle),确保已正确引入Mock邮件器依赖,且作用域为测试:

<!-- Maven -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-mailer-mock</artifactId>
    <scope>test</scope>
</dependency>
// Gradle
testImplementation 'io.quarkus:quarkus-mailer-mock'

该依赖会在测试环境自动替换真实的Mailer实现为Mock版本,确保服务端发送的邮件被拦截到MockMailbox中。

4. 若使用异步发送,需等待邮件处理完成

如果你的服务端使用mailer.sendAsync()异步发送邮件,测试中需要等待邮件处理完成后再断言,可使用MockMailbox的等待方法:

// 等待1条邮件到达,超时时间5秒
mailbox.awaitMessages(1, 5, TimeUnit.SECONDS);
List<Mail> mails = mailbox.getMessagesSentTo(testUser.email);
assertEquals(1, mails.size());
额外排查点
  • 确认测试类上的@QuarkusTest注解没有被错误配置(比如指定了错误的profile)
  • 检查是否存在自定义的Mailer或MockMailbox Bean,覆盖了Quarkus提供的默认实现
  • 调试时可以在测试中打印mailbox的哈希码,对比服务端代码中MockMailboxImpl实例的哈希码,确认是否为同一个对象

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:15:03