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或MockMailboxBean,覆盖了Quarkus提供的默认实现 - 调试时可以在测试中打印
mailbox的哈希码,对比服务端代码中MockMailboxImpl实例的哈希码,确认是否为同一个对象
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

