Play 2.4: How do I disable routes file loading during unit tests?

最后都变了- 提交于 2019-12-03 03:19:27

I am answering my own question here. After spending some more time with Play source code, I figured out the connection between the routes file and the generated Router class. Hope it helps someone else.

Play's route compiler task compiles all files in conf folder ending with .routes as well as the default routes file. Generated class name is always Routes, but the package name depends on the file name. If the file name is routes (the default routes file), compiled class is placed in router package, so the fully qualified class name is router.Routes (which is the default value for play.http.router).

For all other route files, RouteCompiler derives the package name by dropping the .routes from the file name. So for my.test.routes, play.http.router value should be my.test.Routes.

Here is the base class for my tests, with custom router and db configuration elements.

public class MyTestBase extends WithApplication {
    @Override
    protected Application provideApplication() {
        Application application = new GuiceApplicationBuilder()
                .configure("db.default.driver", "org.h2.Driver")
                .configure("db.default.url", "jdbc:h2:mem:play")
                .configure("play.http.router", "my.test.Routes")
                .build();
        return application;
    }
}

If you want to just load no routes at all, here's a trait you could mix in to your test class if you're using Scala, Guice and ScalaTest. This is working with Play 2.5. I've also shown how you could disable filters, since those are related to routing.

I know this is a little different from the ask on Java and Play 2.4, but this might be helpful to people as I got to this question trying to achieve something very similar.

trait DisabledRouting extends PlaySpec with OneAppPerSuite {

  override def fakeApplication(): Application = {
    configureApplication(new GuiceApplicationBuilder()
      .router(Router.empty)
      .configure("play.http.filters" -> "play.api.http.NoHttpFilters"))
      .build()
  }

  /** Override to add additional configuration on top of disabled routing */
  def configureApplication(appBuilder: GuiceApplicationBuilder): GuiceApplicationBuilder = appBuilder

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!