Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题

Posted

技术标签:

【中文标题】Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题【英文标题】:Play 2.2: Problems unit testing code using Play Caching (Scala) 【发布时间】:2014-06-13 14:17:46 【问题描述】:

我已经彻底搜索了互联网,但找不到解决方案。考虑到这应该是一项足够简单的任务,这有​​点令人惊讶。

我们在 Play 应用程序中使用 Redis,其中一部分是禁用默认的 ehcache 实现。但是在我们的单元测试中,运行时,它无法连接到 Redis(错误是“ex:redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源”)。所以我想做的不是在测试中引入Redis,而是使用默认的ehcache实现(我相信禁用ehcache的application.conf不适用于单元测试)。所以我的单元测试的顶部看起来像这样:

class MyTest extends FunSuite with MockitoSugar with BeforeAndAfter 
  val app = FakeApplication(
    additionalPlugins = Seq("play.api.cache.EhCachePlugin"),
    withoutPlugins = Seq("com.typesafe.plugin.RedisPlugin")
  )

并且正在运行每个测试:

running(app) ...

当我运行播放测试时,我得到:“没有注册缓存插件。确保至少启用了一个 CachePlugin 实现。”。这是否意味着我没有正确获取默认缓存插件的名称?我尝试使用“play.api.cache.CachePlugin”,但找不到。插件的名称应该是什么?

这是正确的方法吗?我已经看到使用 inMemoryDatabase 的示例,但我什至无法为我编译它。 Play 无法自行找到 inMemoryDatabase(),虽然它可以找到 Helpers.inMemoryDatabase(),但编译器抱怨它返回 Map[String,String] 但附加配置需要 Map[String,_]。我正在使用 play 2.2.0-M2。

【问题讨论】:

这回答了你的问题吗? 【参考方案1】:

似乎通过您的方法添加/删除插件是不够的,因为它仍在使用您的配置中的ehcacheplugin=disabled。你实际上也不需要additionalPlugins = Seq("play.api.cache.EhCachePlugin"),因为 Play 在默认配置中加载了这个插件,即使它被禁用(嗯,有点.. 它肯定没有达到我的预期)。

使用additionalConfiguration 是要走的路:

val app = FakeApplication(
    additionalConfiguration = Map(
        "ehcacheplugin" -> "enabled"
    ),
    withoutPlugins = Seq("com.typesafe.plugin.RedisPlugin")
 )

附带说明一下,至少升级到 Play 2.2.3 对您来说也是值得的,因为此时 2.2-M2 已经很老了,还不是正式版本。

【讨论】:

以上是关于Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试添加 MySQL / slick 后出现奇怪的 Play Framework 2.2 异常

Play 2.2 动作未与 Web 服务响应处理程序并行处理

Android 2.2 将 Highscore 发布到 google play 服务

Play[2.2] websocket USA Today api 错误 com.fasterxml.jackson.core.JsonParseException: Unexpected chara

Play 2.2 JSON Reads with combinators:如何处理嵌套的可选对象?

带有 Play 2.2 库的密封特征的无噪声 JSON 格式