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
相关产品推荐
相关产品推荐

