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

Posted

技术标签:

【中文标题】play framework + DI中完整的单元测试示例【英文标题】:Complete unit testing example in play framework + DI 【发布时间】:2016-06-03 13:23:59 【问题描述】:

我正在为 play 2.4 应用程序 + DI 寻找完整的单元测试示例。 这个想法很简单:

    我们有 application.test.conf,我想从中读取配置数据、运行进化等。

    然后我想注入使用 DI 的类的实例,例如:

    class UserBean @Inject()(dbConfigProvider: DatabaseConfigProvider, 隐式 val 配置: Configuration, cacheApi: CacheApi)

    然后调用注入对象的方法进行测试。

我在这里描述的问题是:https://***.com/questions/37192401/inject-my-bean-like-class-to-test-play-2-4 但没有人回答我的问题。 感谢任何帮助

【问题讨论】:

【参考方案1】:

    Java 属性在加载带有TypeSafe Config 的conf 文件时具有最高优先级。你可以告诉 sbt 在运行测试时使用不同的配置文件:

    javaOptions in Test += "-Dconfig.resource=" + System.getProperty("config.resource", "application.test.conf")

    您可以使用 GuiceBuilder 创建您的测试应用程序,请参阅here。 请注意,您的测试中必须有一个正在运行的应用程序,例如:

    val myTestApp = new GuiceApplicationBuilder() .overrides(bind[Component].to[MockComponent]) .build "my test" in running(myTestApp) ...

然后你就可以使用注入器了,像这样:

val app2MyDao = play.api.Application.instanceCache[MyDAO]
val myDAO: MyDAO = app2MyDao(myTestApp)

您还可以使用 ScalaTest 的特征,例如 OneAppPerSuite 并覆盖它的假应用。

编辑:我制作了一个简单的project 来展示我想要展示的内容。

【讨论】:

我从文档中得到这个想法,但它不起作用,我正在寻找一些工作示例。 我有以下异常:运行beans.RemoteSystemBeanSpec时未捕获的异常:java.lang.NoSuchMethodError:play.utils.Reflect$.bindingsFromConfiguration(Lplay/api/Environment;Lplay/api/PlayConfig;Ljava /lang/String;Ljava/lang/String;Lplay/utils/Reflect$SubClassOf;Lplay/utils/Reflect$SubClassOf;Lscala/reflect/ClassTag;Lscala/reflect/ClassTag;)Lscala/collection/Seq; sbt.ForkMain$ForkError: play.utils.Reflect$.bindingsFromConfiguration(Lplay/api/Environment;Lplay 您可能正在使用一些旧的库/插件。或者,您可能针对不同版本的库(没有该引用方法)等编译您的类...尝试运行sbt clean,然后运行sbt compile。另外,请尝试使用最新的库。

以上是关于play framework + DI中完整的单元测试示例的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework:使用 H2 内存数据库获取序列 nextval 时出错

Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”

在 Play 2.4 中使用 DI 时如何进行数据库初始化?

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

Play Framework 路由中的变量

Play Framework - 是不是可以在 Play 中结合使用 Promise 和 WebSocket?