我正在使用 ScalaTest 测试我用 Scala 编写的解析器。解析器一次处理一个文件,它有一个单例对象,如下所示:
class Parser{...}
object Resolver {...}
我写的测试用例有点像这样
describe("Syntax:") {
val dir = new File("tests\\syntax");
val files = dir.listFiles.filter(
f => """.*\.chalice$""".r.findFirstIn(f.getName).isDefined);
for(inputFile <- files) {
val parser = new Parser();
val c = Resolver.getClass.getConstructor();
c.setAccessible(true);
c.newInstance();
val iserror = errortest(inputFile)
val result = invokeparser(parser,inputFile.getAbsolutePath) //local method
it(inputFile.getName + (if (iserror)" ERR" else " NOERR") ){
if (!iserror) result should be (ResolverSuccess())
else if(result.isInstanceOf[ResolverError]) assert(true)
}
}
}
现在在每次迭代中,单例对象 Resolver 中先前迭代的副作用不会被清除。
有没有办法指定 scalatest 模块重新初始化单例对象?
更新:使用丹尼尔的建议,我更新了代码,还添加了更多细节。
更新:显然是解析器在做一些可疑的事情。在随后的调用中,它不会丢弃先前的 AST。奇怪的。由于这是题外话,我会挖掘更多,可能会使用一个单独的线程进行讨论,谢谢大家的回答
最终更新:问题出在 Resolver 以外的单例对象上,它位于其他文件中,所以我不知何故错过了它。我能够使用 Daniel Spiewak 的回复来解决这个问题。这是做事的肮脏方式,但考虑到我的情况以及我正在编写测试代码的事实,这也是唯一的事情,这不会进入生产使用。