如何在sbt和IntelliJ IDEA中正确使用ScalaTest的BeforeAndAfterAll trait?

9
我正在尝试为Spark作业设置测试框架。我想使用spark-testing-base的SharedSparkContext特性,该特性依赖于ScalaTest的BeforeAndAfterAll特性来管理设置和拆卸。我的当前环境中有些问题导致beforeAll和afterAll方法在每个测试用例周围被调用。即使我想允许这种冗余行为,我也不能:我不知道如何正确地拆除我的HiveContext对象,因此第二次调用beforeAll会抛出异常,底层是“ERROR XSDB6:另一个Derby实例可能已经引导了数据库/Users/applemacbookpro/git/my-project/metastore_db。” 我使用带有SBT管理的IntelliJ IDEA构建。MacOS 10.11.4 IntelliJ IDEA 2016.1.3,不确定SBT版本,应该是最近的。根据spark-testing-base的README和this question,我已经放置了
parallelExecution in Test := false 

在 build.sbt 文件中。
这是我的示例:
import org.scalatest.{BeforeAndAfterAll, FlatSpec}

class ExampleSpec extends FlatSpec with BeforeAndAfterAll {
  override def beforeAll(): Unit = {
    println("in beforeAll")
    super.beforeAll()
  }

  override def afterAll() {
    println("in afterAll")
    super.afterAll()
  }

  behavior of "example"

  it should "succeed" in {
    println("test 1")
  }

  it should "succeed again" in {
    println("test2")
  }
}

我通过在编辑器窗口上右键单击并从上下文菜单中运行来触发它;输出结果为:

/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/bin/java...
Testing started at 2:50 PM ...
in beforeAll
test 1
in afterAll
in beforeAll
test2
in afterAll

Process finished with exit code 0

无法在Windows-7 / IntelliJ-2016.2 / SBT-0.13.12 / ScalaTest-2.2.6上重现,适用于Scala-2.10和Scala-2.11。 - heenenee
1个回答

3

我认为这是Intellij/Scalatest的一个bug。

当你在“Editor”窗口右击时,我能够复现你的情况。

但如果你在“Project”窗口中右击你的类,然后从上下文菜单中运行,它会如预期一样工作:

in beforeAll
test 1
test2
in afterAll

在编辑器窗口中右键单击时,Intellij似乎会实例化2个运行器,分别针对每个测试方法。您可以在“运行/调试”窗口中看到ExampleSpec类不止出现了一次。

哦,哇,我放弃了并写了一个无聊的东西来绕过这个问题几个月前。(这个无聊的东西是在一个对象中进行设置; 一等单例赢了,我想。) - Cyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接