我正在測試使用ScalaTest在Scala中編寫的解析器。解析器處理一個文件時,它有一個單獨的物體,像以下:ScalaTest:Singleton對象重新初始化的問題
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模塊重新初始化單身人士對象?
更新:使用Daniel的建議,我更新了代碼,還添加了更多細節。
更新:顯然它是解析器是做一些腥事。在隨後的調用中,它不會丟棄之前的AST。奇怪。因爲這是題外話,我將挖掘更多的,可能使用一個單獨的線程的討論,感謝所有的回答
最後更新:這個問題是比解析器以外的單獨的對象,這是在其他一些文件所以我不知何故錯過了它。我用Daniel Spiewak的答覆解決了這個問題。這是骯髒的做事方式,但它也是唯一的事情,考慮到我的情況,並且考慮到我正在寫一個測試代碼,而這個代碼並沒有投入生產使用。
'R'裏面是否有清理方法,或者您希望重新創建嗎? – 2010-08-04 22:15:04
R中沒有清理方法,我無法更改代碼。 你可以重新創建斯卡拉單身人士對象嗎? – thequark 2010-08-04 22:50:57
沒有。他們嚴格單身。按需初始化(由JVM的類加載確定),此後是永久的。當然,它們可以具有可變內部狀態,就像任何Scala類一樣。 – 2010-08-04 23:52:06