如何用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
相关产品推荐
相关产品推荐

