单元测试 PlayFramework 控制器上的“找不到路由器”

Posted

技术标签:

【中文标题】单元测试 PlayFramework 控制器上的“找不到路由器”【英文标题】:"router not found" on unit testing PlayFramework Controllers 【发布时间】:2015-07-15 22:51:27 【问题描述】:

我在尝试按照play framework documentation 步骤对我的控制器进行单元测试时遇到了一些麻烦。

我使用 java 模板创建了一个新应用程序。将生成的 ApplicationTest 替换为文档的 ApplicationTest,更正了与错误包相关的编译错误,但传递给 FakeApplication (ImmutableMap.of("play.http.router", "javaguide.tests.Routes")) 的附加配置仍然存在问题 我在javaguide.tests.Routes 尝试了很多不同的名称和目录,但总是出现以下错误。

[error] 
[error] 1) Error in custom provider, Configuration error: Configuration error[Router not found: javaguide.tests.Routes]
[error]   while locating play.api.test.FakeRouterProvider
[error]   while locating play.api.routing.Router
[error] 
[error] 1 error, took 2.931 sec
[error]     at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
[error]     at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
[error]     at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:321)
[error]     at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:316)
[error]     at play.api.Application$class.routes(Application.scala:111)
[error]     at play.api.test.FakeApplication.routes(Fakes.scala:197)
[error]     at play.api.Play$.start(Play.scala:89)
[error]     at play.api.Play.start(Play.scala)
[error]     at play.test.Helpers.start(Helpers.java:450)
[error]     at play.test.WithApplication.startPlay(WithApplication.java:44)
[error]     ...
[error] Caused by: Configuration error: Configuration error[Router not found: javaguide.tests.Routes]
[error]     at play.api.Configuration$.configError(Configuration.scala:178)
[error]     at play.api.Configuration.reportError(Configuration.scala:829)
[error]     at play.api.routing.Router$$anonfun$load$2.apply(Router.scala:67)
[error]     at play.api.routing.Router$$anonfun$load$2.apply(Router.scala:66)
[error]     at scala.Option.map(Option.scala:146)
[error]     at play.api.routing.Router$.load(Router.scala:66)
[error]     at play.api.inject.RoutesProvider.get$lzycompute(BuiltinModule.scala:66)
[error]     at play.api.inject.RoutesProvider.get(BuiltinModule.scala:63)
[error]     at play.api.test.FakeRouterProvider.get$lzycompute(Fakes.scala:259)
[error]     at play.api.test.FakeRouterProvider.get(Fakes.scala:259)
[error]     at play.api.test.FakeRouterProvider.get(Fakes.scala:258)
[error]     at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
[error]     at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72)
[error]     at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61)
[error]     at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62)
[error]     at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
[error]     at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
[error]     at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
[error]     ... 44 more
[error] Failed: Total 21, Failed 1, Errors 0, Passed 19, Skipped 1

有没有人知道我缺少什么或者可以分享对可以进行此类测试的 github 项目的引用?

如果有帮助,Play Framework 应用的剖析:https://playframework.com/documentation/2.4.x/Anatomy

【问题讨论】:

【参考方案1】:

我昨天遇到了同样的问题,我刚刚回答了我自己的问题,请看看这个问题的答案是否有帮助:Play 2.4: How do I disable routes file loading during unit tests?

【讨论】:

【参考方案2】:

你能检查一下你是否在包中指定了你的routes 文件,即它需要在哪里。 javaguide.tests

javaguide.tests.routes:

GET  /          controllers.Application.index()

【讨论】:

我在 javaguide.tests.Routes 尝试了很多不同的名称和目录,但总是出现上述错误。考虑到应用程序的目录结构,我应该把 javaguide.tests.Routes 文件放在哪里?

以上是关于单元测试 PlayFramework 控制器上的“找不到路由器”的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 中为 OneAppPerTest 中的每个测试重新创建数据库并进化

play framework + DI中完整的单元测试示例

如何在 Cordapp 中对服务和控制器(kotlin)进行单元测试?

Laravel 单元测试显示完全错误

Play-Module 内部的单元测试(JPA,eclipse PersistenceProvider)

单元测试