1

我已经成功地使用 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在我尝试序列化时。

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

4

3 回答 3

2

我有一个程序(使用 Akka 自主编写),它广泛处理文件系统操作。我使用 ScalaIO(而不是本机 Java 库java.io._类)编写它。ScalaIO 包括,除其他外,RamFileSystem它允许您以镜像真实文件系统操作的方式模拟文件系统内容和操作,而无需涉及文件系统和 I/O 系统调用。

于 2013-03-13T18:34:05.950 回答
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
于 2013-03-13T08:03:46.040 回答
1

你可以模拟出 a File,但这并不意味着一切都会好起来的。默认情况下,当您在 mock 上调用方法时,它会返回null(例如,0 表示int值)。

因此,如果您正在测试的函数调用其中一种File方法,您将需要提供合理的默认值。例如:

val f = mock[File]

f.createNewFile returns true
f.isFile returns true
f.list returns Array("child1", "child2")

话虽如此,如果您的grater对象确实需要一个功能文件来写入,那么可能无法真正模拟它。

于 2013-03-13T12:24:55.447 回答