我可以在我的Specs2测试中使用模拟文件来写入文件吗?如果是这样,怎么样?

时间:2013-03-13 07:09:31

标签: scala testing mocking mockito specs2

我已成功使用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

我认为我错过了某种类型的“存根”,但我找不到任何类似的例子来提出解决方案。任何帮助,将不胜感激。

3 个答案:

答案 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对象确实需要写入一个功能文件,那么可能无法真正模仿它。