【问题标题】:Scala, PlayFramework, Mockito, ExecutionContext nullScala、PlayFramework、Mockito、ExecutionContext null
【发布时间】:2016-08-26 14:01:38
【问题描述】:

按照这个答案:https://stackoverflow.com/a/30806548/4496364 我在我的项目中使用 Play 的 ExecutionContext。

最近我需要使用 Mockito 来测试 Play 中的一些服务。 所以,这是它的简化版本:

import scala.concurrent.{ Future, ExecutionContext }
import play.api.libs.concurrent.Execution.Implicits.defaultContext

case class Model(id: Int, name: String)

trait DAO {
  def findAll(implicit ec: ExecutionContext): Future[List[Model]]
}

class Service(dao: DAO) {
  def findAll: Future[List[Model]] = dao.findAll
}

测试:

import play.api.libs.concurrent.Execution.Implicits.defaultContext
// doesn't work when different ExecutionContext
// import scala.concurrent.ExecutionContext.Implicits.global


class FuturesTest extends PlaySpec with MockitoSugar with ScalaFutures {

  "Service" should {
    "return all future data" in {
      val mockModel = Model(1, "name")
      val mockDAO = mock[DAO]
      when(mockDAO.findAll) thenReturn Future.successful(List(mockModel))

      val service = new Service(mockDAO)
      val futureData = service.findAll
      whenReady(futureData) { data =>
        data.map(_.name) must contain(mockModel.name)
      }
    }
  }

}

注意测试中的注释,当我在Service 中调用dao.findAll 时,我得到一个NullPointException。起初我认为 Mockito 无法处理 Scala 的 Futures,但我发现 ExecutionContext 是问题所在。由于我不是并发专家,有人可以解释为什么会发生这种情况吗?

【问题讨论】:

标签: scala playframework mockito scalatest


【解决方案1】:

万一有人在看,答案很明显......

import org.mockito.Matchers.any
..
mockDAO.findAll(any[ExecutionContext])

我不熟悉 Mockito 的工作原理,也不熟悉 Scala 的隐式。 当你没有通过any[ExecutionContext] 时,Scala 会用测试中的隐式填充它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多