Я тестирую парсер, написанный на Scala, используя ScalaTest.Синтаксический анализатор обрабатывает один файл за раз, и у него есть одноэлементный объект, подобный следующему:
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 не устранены.
Есть ли способ указать для самого масштабируемого модуля повторную инициализацию одноэлементных объектов?
Обновление : по предложению Даниэля я обновил код, также добавил ещедетали.
Обновление : Видимо, это парсер, который делает что-то подозрительное.При последующих вызовах не сбрасывает предыдущий AST.странный.поскольку это не по теме, я бы больше копался и, вероятно, использовал отдельную ветку для обсуждения, спасибо всем за ответы
Окончательное обновление : проблема была с одноэлементным объектом, отличным от Resolver,это было в каком-то другом файле, поэтому я как-то пропустил это.Я смог решить это, используя ответ Даниэля Спивака.Это грязный способ делать вещи, но это также единственное, учитывая мои обстоятельства, а также учитывая тот факт, что я пишу тестовый код, который не будет использоваться в производстве.