如何在 Mutiny 中断言 Uni 抛出指定异常
发布时间 - 2026-01-09 00:00:00 点击率:次本文介绍在 quarkus + mutiny 项目中,如何正确编写单元测试来验证 `uni
在基于 Mutiny 的响应式应用(如 Quarkus)中,Uni 是处理单个异步结果的核心类型。当业务逻辑需在数据缺失时主动抛出异常(例如 BusinessException),测试该异常是否被正确触发至关重要。但直接复用 Multi 的 AssertSubscriber 会导致编译错误——因为 Uni 和 Multi 的订阅器接口不兼容:UniSubscriber 与 MultiSubscriber 是不同泛型契约,AssertSubscriber 专为 Multi 设计,无法安全用于 Uni。
✅ 正确做法是使用 Mutiny 官方提供的 UniAssertSubscriber(位于 io.smallrye.mutiny:test-utils 模块)。它专为 Uni 设计,支持类型安全的失败断言。
首先,确保已引入测试依赖(Maven):
io.smallrye.reactive mutiny-test-utilstest
然后,修正测试代码如下:
@Test
public void shouldThrowAnErrorWhenUserIsNotFound() {
// 模拟仓库返回 nullItem,触发 map 中的异常分支
Mockito.when(userRepository.findById(Mockito.any()))
.thenReturn(Uni.createFrom().nullItem());
service.searchUser(new ObjectId())
.subscribe()
.withSubscriber(UniAssertSubscriber.create()) // ✅ 使用 UniAssertSubscriber
.assertFailedWith(BusinessException.class, "Could not find an user with the given id.");
}⚠️ 注意事项:
- 不要手动声明 AssertSubscriber 变量(如 Asser
tSubscriber subscriber = ...),这会干扰泛型推导; - 必须调用 .withSubscriber(UniAssertSubscriber.create()),而非 AssertSubscriber.create();
- assertFailedWith(Class, String) 同时校验异常类型与消息内容,增强测试可靠性;
- 若只需校验异常类型,可使用 assertFailedWith(BusinessException.class);
- 确保 BusinessException 是运行时异常(RuntimeException 子类),否则 Mutiny 默认不会将其作为“失败事件”传播(而是包装为 UniOnFailure 行为)。
? 小结:Uni 的测试必须匹配其专属订阅器工具。UniAssertSubscriber 提供了类型安全、链式流畅的断言 API,是验证异常路径的首选方案。避免混用 Multi 工具类,可彻底规避泛型绑定错误,并提升测试可维护性与准确性。
# react
# 工具
# ai
# 编译错误
# quark
# maven
# String
# 子类
# 接口
# class
# 泛型
# 事件
# 异步
# 链式
# 专为
# 抛出
# 只需
# 推荐使用
# 将其
# 而非
# 这会
# 至关重要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
如何用y主机助手快速搭建网站?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
简历没回改:利用AI润色让你的文字更专业
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel如何使用模型观察者?(Observer代码示例)
如何在万网ECS上快速搭建专属网站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
想要更高端的建设网站,这些原则一定要坚持!
Laravel如何使用Eloquent进行子查询
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何将凡科建站内容保存为本地文件?
黑客入侵网站服务器的常见手法有哪些?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
jquery插件bootstrapValidator表单验证详解
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何为不同团队 ID 动态生成多个“认领值班”按钮
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
PHP 500报错的快速解决方法
详解MySQL数据库的安装与密码配置
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Bootstrap CSS布局之列表
魔方云NAT建站如何实现端口转发?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel怎么为数据库表字段添加索引以优化查询
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Android GridView 滑动条设置一直显示状态(推荐)
如何在IIS中配置站点IP、端口及主机头?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
深入理解Android中的xmlns:tools属性
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
html5的keygen标签为什么废弃_替代方案说明【解答】
零服务器AI建站解决方案:快速部署与云端平台低成本实践
javascript基本数据类型及类型检测常用方法小结
教你用AI润色文章,让你的文字表达更专业
bing浏览器学术搜索入口_bing学术文献检索地址
动图在线制作网站有哪些,滑动动图图集怎么做?


tSubscriber subscriber = ...),这会干扰泛型推导;