我已成功使用Specs2测试文件的序列化,但测试使用的是真实文件(写入/ tmp /)。我宁愿不接触磁盘只是为了测试。有没有办法使用模拟文件?
def serializeAndDeserializeFromDatafile[X <: CaseClass : Manifest](old: X, maybeGrater: Option[AvroGrater[X]] = None): X = {
val g = maybeGrater.getOrElse(grater[X])
//val outfile = mock[File]
val outfile = new File("/tmp/file1.avro")
g.serializeToDataFile(outfile, old) //Serialize to file
val infile = outfile
g.asObjectFromDataFile(infile) //Deserialize from file
}
我尝试使用Mockito来模拟我的outfile
(上面注释掉的行)。在我天真的尝试中,我可以创建Mock for File, hashCode: 1583021903
,但在我尝试序列化时似乎是null
。
我认为我错过了某种类型的“存根”,但我找不到任何类似的例子来提出解决方案。任何帮助,将不胜感激。
答案 0 :(得分:2)
我有一个程序(使用Akka自主编写),它在文件系统操作中进行了广泛的处理。我使用ScalaIO(而不是本机Java库java.io._
类)编写了它。 ScalaIO包括RamFileSystem
,它允许您以镜像实际文件系统操作的方式模拟文件系统内容和操作,而不涉及文件系统和I / O系统调用。
答案 1 :(得分:1)
您可以尝试使用OutputStream / InputStream而不是文件吗?
示例:
val out:OutputStream = null
// val testOut = new ByteArrayOutputStream()
// val realOut = new FileOutputStream(new File("/tmp/file1.avro"))
g.serializeToOutputStream(out, old) //Serialize to file
val in:InputStream = null
// val testIn = new ByteArrayInputStream(testOut.toByteArray)
// val realIn = new FileInputStream(new File("/tmp/file1.avro"))
g.asObjectFromInputStream(in) //Deserialize from file
答案 2 :(得分:1)
你可以嘲笑File
,但这并不意味着事情会好起来的。默认情况下,当您在模拟上调用方法时,它会返回null
(例如,对于int
值返回0)。
因此,如果您正在测试的函数调用File
方法之一,则需要提供合理的默认值。例如:
val f = mock[File]
f.createNewFile returns true
f.isFile returns true
f.list returns Array("child1", "child2")
话虽如此,如果您的grater
对象确实需要写入一个功能文件,那么可能无法真正模仿它。