You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scalamock/Scalatest Mock Hadoop File System?

用Scalamock 4.4.0和Scalatest 3.2.9 Mock Hadoop文件系统的问题与尝试

我需要用Scalamock 4.4.0和Scalatest 3.2.9来Mock Hadoop的org.apache.hadoop.fs.FileSystem,但发现无法直接Mock,于是尝试了两种解决思路:

第一种尝试:在主逻辑中新增Wrapper类

为了能Mock,我在主业务代码里定义了一个HadoopFsWrapper类,将FileSystem的调用封装起来:

class HadoopFsWrapper(path: Path)(implicit fs: org.apache.hadoop.fs.FileSystem) {
  def listStatus(path) = fs.listStatus(path)
}

class HadoopService(path: Path)(implicit val fs: HadoopFsWrapper){
  def someLogic() = fs.listStatus(path)
}

测试时直接Mock这个Wrapper类,注入到HadoopService中:

implicit val fs = mock[HadoopFsWrapper]

val hs = HadoopService(path)
// other test logic

这个方案能正常运行,但我觉得为了测试修改主业务代码并不是好的实践。

第二种尝试:仅在测试范围内创建装饰式Wrapper类

我想只在测试代码里实现Wrapper,通过继承FileSystem做适配,这样不用改动主业务代码:

// only in test scope
class HadoopFsWrapper(path: Path) extends org.apache.hadoop.fs.FileSystem {
  def listStatus(path) = listStatus(path)
  // dummies for implemented FileSystem-methods
}
object HadoopFsWrapper {
  def apply(): org.apache.hadoop.fs.FileSystem = new HadoopFsWrapper
}

// main logic
class HadoopService(path: Path)(implicit val fs: org.apache.hadoop.fs.FileSystem){
  def someLogic() = fs.listStatus(path)
}

但尝试Mock这个HadoopFsWrapper时,得到的实例是null,没法正常使用。

内容的提问来源于stack exchange,提问作者Jelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:05:46