如何在 Mutiny 中断言 Uni 抛出指定异常

发布时间 - 2026-01-09 00:00:00    点击率:

本文介绍在 quarkus + mutiny 项目中,如何正确编写单元测试来验证 `uni` 在业务逻辑中是否按预期抛出特定类型(如 `businessexception`)的异常,重点解决 `assertsubscriber` 类型推导错误及推荐使用 `uniassertsubscriber` 的最佳实践。

在基于 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-utils
    test

然后,修正测试代码如下:

@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 变量(如 AssertSubscriber 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学术文献检索地址  动图在线制作网站有哪些,滑动动图图集怎么做?