我最近发现了scala.sys.process并开始玩它。
我试图为bash文件编写解析器,并且在编写单元测试时发现了==方法的奇怪行为。 (我知道我可以直接运行bash文件,但将其视为练习)。
import scala.sys.process._
def processFromFile(file: String) = {
val in = Source.fromFile(file)
val lines = in.getLines
val commands = lines filterNot(_.startsWith("#"))
def toProcessBuilder(commands: List[String]): ProcessBuilder = commands match {
case a :: b :: l => a ### toProcessBuilder(b :: l)
case a :: Nil => a
case Nil => ""
}
toProcessBuilder(commands.toList)
}
这是我的单元测试:
test("the process parser works correctly") {
val process = "ls" ### "git log"
val processLoaded = Experiment.processFromFile("experiments/test.sh")
assert(process == processLoaded)
}
" test.sh"文件仅包含:
#test
ls
git log
但单元测试失败,并带有以下代码:
[info] - the process parser works correctly *** FAILED ***
[info] ( [ls] ### [git, log] ) did not equal ( [ls] ### [git, log] )
对我来说,它看起来像进程和processLoaded是等于,如果我比较两个测试的_.toString是接受的。
那么这里发生了什么,为什么scala能够正确比较这两个对象?
答案 0 :(得分:2)
对于ProcessBuilder
(顺便说一句,不是具体类,但是接口),相等的含义可能不是那么直接,即使它在你的情况下似乎应该是相同的命令有相同的操作。
您获得的实现没有自定义的equals / hashcode,因此将继承默认对象equals,该对象基于对象标识进行比较。这意味着只有相同的实例才会与自身相同。
我会为测试框架创建一个特殊的比较器/匹配器,它与ProcessBuilder中的命令列表相匹配(例如,像toString
所说的那样):