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

Akka Streams中模拟Source抛出异常的正确方法

解决Akka Streams中模拟Source抛出异常的编译错误问题

你遇到的编译错误核心原因是**getSource方法的返回类型是Source[ByteString, NotUsed],但你直接给thenReturn传了一个RuntimeException对象,类型完全不匹配**——Mockito的thenReturn要求传入的返回值必须和被模拟方法的返回类型一致,所以编译器无法解析重载的thenReturn方法。

针对你的测试需求,分两种常见场景给出正确实现方式:

场景1:调用getSource方法时立即抛出异常

如果你的测试目标是验证当调用getSource方法时就触发异常(比如参数非法导致的即时失败),直接使用Mockito的thenThrow方法即可,无需返回Source:

val error = new RuntimeException("error in source")
when(awsS3Bucket.getSource(any[String])).thenThrow(error)

这样当代码调用awsS3Bucket.getSource(...)时,会立刻抛出你定义的RuntimeException。

场景2:返回的Source在流运行时抛出异常

如果你的测试目标是验证流在处理过程中出现异常(比如S3读取时的IO错误,方法本身能正常返回Source,但流执行时报错),需要先创建一个预定义失败的Source,再用thenReturn返回它:

val error = new RuntimeException("error in source")
// 创建一个会失败的Source,当流启动时立即抛出异常
val failedSource = Source.failed[ByteString](error)
when(awsS3Bucket.getSource(any[String])).thenReturn(failedSource)

这种情况下,调用getSource会正常返回Source对象,但当这个Source被订阅运行(比如连接到Sink或者调用run())时,会立即失败并抛出指定的异常,完美模拟Akka Streams运行时的错误场景。

根据你的单元测试需求选择对应的方式即可~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:32:49