gpt4 book ai didi

ScalaTest:单例对象重新初始化的问题

转载 作者:行者123 更新时间:2023-12-03 04:21:39 24 4
gpt4 key购买 nike

我正在使用 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)
}
}
}

现在,在每次迭代时,单例对象解析器内先前迭代的副作用不会被清除。

有没有办法指定scalatest模块来重新初始化单例对象?

更新:根据 Daniel 的建议,我更新了代码,还添加了更多详细信息。

更新:显然是解析器在做一些可疑的事情。在后续调用中,它不会丢弃之前的 AST。奇怪的。由于这不是主题,我会进行更多挖掘,并可能使用单独的线程进行讨论,感谢大家的回答

最终更新:问题出在解析器之外的单例对象上,它位于其他文件中,所以我不知何故错过了它。我能够使用 Daniel Spiewak 的回复解决这个问题。这是一种肮脏的做事方式,但考虑到我的情况以及我正在编写一个不会投入生产使用的测试代码的事实,这也是唯一的事情。

最佳答案

根据语言规范,不,没有办法重新创建单例对象。但是,可以反射调用单例的构造函数,这会覆盖包含实际单例值的内部 MODULE$ 字段:

object Test

Test.hashCode // => e.g. 779942019

val c = Test.getClass.getConstructor()
c.setAccessible(true)
c.newInstance()

Test.hashCode // => e.g. 1806030550

现在我已经与您分享了这个邪恶的 secret ,让我警告您永远不要这样做。我会非常非常努力地调整代码,而不是玩像这样的鬼把戏。然而,如果事情真像你说的那样,而且你确实没有其他选择,那么这至少是一些东西。

关于ScalaTest:单例对象重新初始化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com