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.routes
,play.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,Guice
和 ScalaTest
。这适用于 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
}
背景:我正在使用带有 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.routes
,play.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,Guice
和 ScalaTest
。这适用于 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
}