Scala+Play测试中Mockito忽略方法入参的实现及依赖问题
解决Scala+Play中Mockito
any()匹配器找不到的问题 这个问题我之前在测试Scala项目时也碰到过——单纯用Java版的Mockito核心库,在Scala里使用匹配器会因为语言类型系统的差异出问题,下面给你详细的解决步骤:
1. 首先补充必要的依赖
你当前只引入了mockito-core,这是Java环境下的依赖,在Scala中需要添加专门的Mockito Scala适配库,有两种常用选择:
选项一:使用mockito-scala(推荐,专门为Scala优化)
修改你的build.sbt,添加以下依赖:
libraryDependencies += "org.mockito" %% "mockito-scala" % "1.17.12" % Test
注:版本可以根据你的Scala版本调整,比如Scala 2.12/2.13都可以用这个版本,稳定版足以支持大多数测试场景。
选项二:结合ScalaTest的Mockito集成
如果项目里已经在用ScalaTest,可以用scalatestplus-mockito,它会帮你无缝整合Mockito和ScalaTest:
// 对应你使用的Mockito 2.24.5版本,选择适配的依赖版本 libraryDependencies += "org.scalatestplus" %% "mockito-2-13" % "3.1.2.0" % Test
2. 在代码中正确使用any()匹配器
添加完依赖后,需要导入Scala兼容的匹配器,并且显式指定匹配的类型(Scala是强类型语言,显式指定能避免类型推断问题):
用mockito-scala的写法
// 导入匹配器和Mockito工具类 import org.mockito.MockitoSugar._ import scala.concurrent.Future // 假设user是你预先定义好的User实例 when(mockUserRepository.save(any[User])).thenReturn(Future.successful(Some(user)))
用scalatestplus-mockito的写法
// 测试类可以继承MockitoSugar,或者直接导入工具方法 import org.scalatestplus.mockito.MockitoSugar._ import scala.concurrent.Future when(mockUserRepository.save(any[User])).thenReturn(Future.successful(Some(user)))
为什么原来的写法会报错?
Java版Mockito的any()位于org.mockito.ArgumentMatchers中,但Scala的泛型系统和Java的通配符机制不兼容,直接使用会导致编译器无法找到合适的方法签名,而且默认也不会自动导入这些匹配器。Scala适配库专门处理了这个问题,提供了符合Scala类型系统的匹配器方法。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

