Scala 无法在测试运行中使用更改播放插件(fakeApp)

Scala 无法在测试运行中使用更改播放插件(fakeApp),scala,playframework-2.3,Scala,Playframework 2.3,我试图用不同的模拟插件代替真实的插件进行测试。它可以使用一个mock,但是当我有两个mock时,它总是使用第一个mock class UserSpec extends Specification { "User" should { val fakeAppA = new FakeApplication( additionalPlugins = Seq( "FakeServiceA" ) ) "have FakeServi

我试图用不同的模拟插件代替真实的插件进行测试。它可以使用一个mock,但是当我有两个mock时,它总是使用第一个mock

class UserSpec extends Specification {
  "User" should {
    val fakeAppA = new FakeApplication(
      additionalPlugins = Seq(
        "FakeServiceA"
        )
      )

    "have FakeServiceA " in running(fakeAppA) {
      UserController.doit() === "FakeServiceA"
    }

    val fakeAppB = new FakeApplication(
      additionalPlugins = Seq(
        "FakeServiceB"
        )
      )

    "have FakeServiceB" in running(fakeAppB) {
      // doesnt work gets FakeServiceA
      UserController.doit() === "FakeServiceB"
    }
  }
}

object UserController extends Controller {
  val service = Play.application.plugin[Service]
    .getOrElse(throw new RuntimeException("Service not loaded"))

  def doit() = service.serviceIt()
}

class Service(app: Application) extends Plugin {
  def serviceIt(): String = "Service"
}

class FakeServiceA(app: Application) extends Service(app) {
  override def serviceIt(): String = "FakeServiceA"
}

class FakeServiceB(app: Application) extends Service(app) {
  override def serviceIt(): String = "FakeServiceB"
}

不会为每个测试重新创建控制器,因为它是scala对象。因此,您应该通过def而不是val引用插件

 object UserController extends Controller {
-       val service = Play.application.plugin[Service]
+       def service = Play.application.plugin[Service]
        .getOrElse(throw new RuntimeException("Service not loaded")) 

您可能可以发布
UserController
的代码以使其更清晰。你也可以接受自己的答案。