如何使用 JUnitRunner 在 ScalaTest 中使用 JUnit4 生命周期回调?

How to make JUnit4 lifecycle callbacks work in ScalaTest with JUnitRunner?

根据 ScalaTest 文档 it's possible to use JUnitRunner 到 运行 测试。我的假设是,如果它 运行s 与 JUnitRunner,它的回调方法(即标有 @Before@After 注释的方法也应该工作。但显然我的假设是错误的。我已经创建了一个简单的例子来演示它:

import org.junit.Before
import org.junit.runner.RunWith
import org.scalatest.{FunSuite, _}
import org.scalatest.junit.JUnitRunner

@RunWith(classOf[JUnitRunner])
class Test extends FunSuite {

  @Before
  def before() = {
    println("before test")
  }

  test("nothing") {
    println("test is started")
  }
}

如果你 运行 这个例子,你会看到 test is started 行,而不是 before test.

我知道 ScalaTest 生命周期回调,但问题是我需要让 JUnit 回调以某种方式工作。我想为 Play 2.4 应用程序编写一个测试,它 play.test.WithBrowser class 依赖于 JUnit 回调。我找到了这个问题的解决方法:

 var testBrowser : TestBrowser = _

 before {
   new WithBrowser {
     override def createBrowser(): Unit = {
       super.createBrowser()
       testBrowser = browser
     }
 }.createBrowser()

}

但我认为它很丑陋,我怀疑有更好的方法。

所以,我的问题是是否可以使这些 JUnit 生命周期回调与 ScalaTest 一起工作?如果可能的话,该怎么做?

您应该可以使用 JUnitSuite 而不是 FunSuite 来完成此操作。文档在这里:

http://www.scalatest.org/getting_started_with_junit_4_in_scala http://doc.scalatest.org/2.2.4/index.html#org.scalatest.junit.JUnitSuite

我按照 Noah 的建议做了,并且成功了。以防万一有人在 Play 2.x 和 WithBrowser 上遇到同样的问题,我最终进行了这样的测试:

class IntegrationSpec extends WithBrowser with JUnitSuiteLike with Matchers {

  @Test def workWithBrowser() {
     browser.goTo("http://localhost:9000")
     browser.pageSource should include("Add Person")
  }
}