Scala 3中带using参数的方法Mock问题求助
解决Scala上下文参数(using子句)与Mockito匹配器的冲突问题
你的问题核心是Scala 3的**上下文参数(using子句)**和Mockito匹配器的语法适配问题,两种写法的错误原因和解决方法如下:
错误原因解析
- 第一种写法
when(myClass.foo(any[Int]())).thenReturn(IO.unit):
编译器允许这种写法是因为上下文参数可隐式推导,但Mockito运行时会识别到方法有两个参数列表,要求为每个参数列表提供匹配器,因此报错“2 matchers expected, 1 recorded”。 - 第二种写法
when(myClass.foo(any[Int]())(any[String]())).thenReturn(IO.unit):
不符合Scala 3语法规则——第二个参数列表是using修饰的上下文参数,必须用using关键字显式标记,否则编译器会认为方法不接受该参数列表结构,抛出“method foo in class MyClass does not take more parameters”错误。
正确解决方案
在Stub方法时,使用using关键字显式传递第二个参数列表的匹配器,语法如下:
when(myClass.foo(any[Int]())(using any[String]())).thenReturn(IO.unit)
这样既符合Scala 3上下文参数的语法要求,又为Mockito提供了两个参数列表对应的匹配器,编译和运行都能正常通过。
内容的提问来源于stack exchange,提问作者fr3ak
相关产品推荐
相关产品推荐

