如何测试扩展自定义特征的Play应用程序

时间:2016-12-02 03:02:43

标签: scala testing dependency-injection playframework specs2

我无法将mixin的测试编写到我的Play应用程序中,该应用程序在其自身的线程中独立于游戏运行。我尝试过度编写WithApplication.provideApplication方法而没有运气。我收到inheriting conflicting methods错误。 (一个来自真正的应用程序" MyRunnableSystemWrapper",一个来自我的模拟假混合,名为" MyMockedSystemWrapper")。

execute(system)运行我的系统,在其他地方进行测试,并且有副作用(连接到网络服务,因此当这些事情不可用时,测试失败。好消息是我有一个使用了我的系统包装器的模拟服务没有副作用的系统和DB /网络电话被嘲笑。但我不知道如何将我的应用程序的这个MOCKED版本提供给#34; WithApplication" test。

为清晰起见减少了代码:

class Application extends Controller with MyRunnableSystemWrapper {

  val pool: ExecutorService = Executors.newFixedThreadPool(1)
  val system = new MyRunnableSystem() //system is abstract in MRSW ^^^ above
  pool.execute(system)

  def index = Action {
    OK("HI")
  }
}

我的测试:

class MyAppTest(implicit ee: ExecutionEnv) extends Specification  {

  abstract class WithMyMockApp extends WithApplication {
    def provideApplication = new controllers.Application with MyMockedSystemWrapper // This imports MyRunnableSystemWrapper 

  }

  "Sending a GET request" should {
    "Respond with OK" in new WithMyMockApp {
      val response = route(app, FakeRequest(GET, "/")).get
      status(response) mustEqual OK
    }
  }
}

如果我没有在正确的地方运行我的Runnable并且应该在其他地方调用它以使这个测试更容易,请告诉我!

1 个答案:

答案 0 :(得分:0)

您可以注入系统包装而不是扩展它

trait SystemWrapper {
    def execute(system: RunnableSystem)
}

class MyRunnableSystemWrapper extends SystemWrapper {...}
class MyMockedSystemWrapper extends SystemWrapper {...}

class Application @Inject() (systemWrapper SystemWrapper) extends Controller {

然后你需要告诉Guice你想要运行时SystemWrapper的实现以及哪一个用于测试。一种方法是使用您在.conf文件中设置的运行时/测试的不同Guice模块。