Play 2.4:如何在单元测试期间禁用路由文件加载?

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

背景:我正在使用带有 InjectedRoutesGenerator 和 Guice 模块的 Play 2.4 (Java) 来配置各种依赖项。但是在单元测试期间,FakeApplication 试图通过注入器从路由文件加载所有控制器,其中一些由于单元测试环境中不可用的外部依赖项而失败。

如何在扩展自 play.test.WithApplication 的单元测试期间禁用默认路由文件处理?或者如何用自定义路由文件替换默认路由?

我尝试使用 play.http.router config option override referenced here,但我尝试使用任何方法都出现 Router not found 错误。显然我犯了一些错误,我不确定在哪里。

我不太理解 my.application.Router 和 conf/my 之间的 link。config reference 中引用的 application.routes。 routes 以外的路由文件也不会被编译。

我在这里回答我自己的问题。在花了更多时间研究 Play 源代码后,我弄清楚了路由文件和生成的路由器之间的联系 class。希望对其他人有帮助。

Play 的路由编译器任务会编译 conf 文件夹中以 .routes 结尾的所有文件以及默认的 routes 文件。生成的 class 名称始终是 Routes,但包名称取决于文件名。如果文件名为routes(默认routes文件),编译后的class放在router包中,所以完全限定的class名称为router.Routes(这是 play.http.router).

的默认值

对于所有其他路由文件,RouteCompiler 通过从文件名中删除 .routes 来派生包名称。所以对于 my.test.routesplay.http.router 值应该是 my.test.Routes.

这是我测试的基础 class,带有自定义路由器和数据库配置元素。

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;
    }
}

如果您根本不想加载任何路由,这里有一个 trait 您可以混入您的测试 class 如果您使用的是 Scala,GuiceScalaTest。这适用于 Play 2.5。我还展示了如何禁用过滤器,因为它们与路由相关。

我知道这与 Java 和 Play 2.4 上的问题略有不同,但这可能对人们有所帮助,因为我试图达到非常相似的目的。

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

}