Akka-Stream结合Mockito使用时出现thenReturn不是Nothing成员错误如何解决
问题原因分析
你遇到的value thenReturn is not a member of Nothing错误,本质是Scala编译器类型推断失败,导致Mockito的when方法返回类型被推断为Nothing,而Nothing类型不存在thenReturn方法,和你的mock逻辑本身无关,问题出在Source的构造写法上。
原代码的核心错误
- 原代码中构造Akka Stream的写法错误:
Source("Dummy Byte string")会把Source的元素类型推断为Char,但方法声明要求的是元素类型为ByteString的Source[ByteString, NotUsed],二者类型完全不匹配。 - 类型不匹配触发了连锁的泛型推断问题:Mockito的
when是泛型方法,当thenReturn传入的参数类型和目标方法的返回类型不匹配时,编译器无法正确推断when的泛型参数,最终就会将其推断为Nothing,也就找不到对应的thenReturn方法。
修改后代码生效的原因
你单独定义的val source = Source.single(ByteString("Some dummy string")),明确构造了元素类型为ByteString的Source,和方法声明要求的返回类型完全匹配,编译器可以正常推断when的泛型参数,自然就能正常调用thenReturn方法。
补充方案
你也可以不用单独定义变量,直接在tuple内写正确的Source构造方式即可生效:
when(service.fetchData(id)).thenReturn(Future.successful( Some((ContentTypes.`application/octet-stream`, 1000, Source.single(ByteString("Dummy Byte string")))) ))
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

