【问题标题】:Mockito doReturn: ambiguous reference to overloaded definitionMockito doReturn:对重载定义的模糊引用
【发布时间】:2026-01-28 06:45:02
【问题描述】:

我正在尝试将 Scala 系统移植到 Mockito2。有一些使用 doReturn 的测试用例,现在在 Mockito 2.18.0 中出现此错误:

Error:(34, 5) ambiguous reference to overloaded definition,
both method doReturn in object Mockito of type (x$1: Any, x$2: Object*)org.mockito.stubbing.Stubber
and  method doReturn in object Mockito of type (x$1: Any)org.mockito.stubbing.Stubber
match argument types (com.twitter.util.Future[Unit])
doReturn(Future.Unit).when(f.adapterSpy).myFunction(userData, Some(offerId), Always)

查看Mockito.javadoReturn 真的是这样超载:

public static Stubber doReturn(Object toBeReturned) 
public static Stubber doReturn(Object toBeReturned, Object... toBeReturnedNext)

这怎么不总是模棱两可的?如何编译?

谢谢

【问题讨论】:

    标签: java scala mockito


    【解决方案1】:

    作为临时解决方法,您可以执行以下操作:

    trait MockitoHelper extends MockitoSugar {
      def doReturn(toBeReturned: Any): Stubber = {
        Mockito.doReturn(toBeReturned, Nil: _*)
      }
    }
    

    然后让你的测试混入这个MockitoHelper

    【讨论】:

    • 这正是 mockito-scala 所做的,但在 MockitoSugar 特征中已经为您完成了
    • 我认为您在这里不需要extends MockitoSugar。覆盖 doReturn 就足够了。如果我错了,请纠正我:)
    • 对我来说,将 doReturn 替换为 Mockito.doReturn(toBeReturned, Nil: _*) 就足够了。
    【解决方案2】:

    这也可以通过使用doAnswer 而不是doReturn 来克服

    // no good
    doReturn(true).when(foo).bar()
    // works
    doAnswer(_ => true).when(foo).bar()
    

    【讨论】:

      【解决方案3】:

      Scala backlog 中有一张票。见https://github.com/scala/bug/issues/4775

      【讨论】:

        【解决方案4】:

        这有点自我推销,但我刚刚发布了一个名为 mockito-scala 的库,它解决了这个问题以及更多问题,它是 mockito 生态系统的一部分,所以希望在使用 Scala 时成为默认库,你可以在这里找到它https://github.com/mockito/mockito-scala 提供了获取依赖项的信息以及它实际解决了哪些问题。

        专门针对您的问题,您可以编写此代码,它可以开箱即用

        doReturn(Future.successful(())).when(f.adapterSpy).myFunction(userData, Some(offerId), Always)
        

        我改变了未来的表达方式,只是因为这是创造 Unit 完整未来的正确方式

        【讨论】:

        • 你好,最好解释一下这个库是如何解决问题的,包括代码(看看*.com/help/how-to-answer
        • @baptistemm 好点,我没有在这里做,因为对于 OP 不起作用的完全相同的代码将在这个库中开箱即用,Github 页面链接也解释了所有其他功能以及
        • 我们更喜欢让代码在答案中,以避免在引用消失时丢失信息。
        • @baptistemm 已修复!
        • @BaptisteMille-Mathias 很抱歉很迂腐,但Future.unit 是合法的......我认为Unit 的大写是问题中唯一的问题:) 另外,感谢这里的提示— 它用 scala 解决了我的可变参数问题!