Scala, PlayFramework, Mockito, ExecutionContext null Scala,PlayFramework,Mockito,ExecutionContext null。

3

根据这个回答:https://dev59.com/y10a5IYBdhLWcg3wAEo3#30806548,我在项目中使用了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)
      }
    }
  }

}

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


也许问题不在于ExecutionContext,而在于“trait”?https://dev59.com/1lfUa4cB1Zd3GeqPMuwX?rq=1 - Arthur Zagretdinov
1个回答

4
如果有人在寻找答案,那么答案是显而易见的...
import org.mockito.Matchers.any
..
mockDAO.findAll(any[ExecutionContext])

我不熟悉Mockito的工作方式,也不熟悉Scala的隐式参数。

当您不传递any[ExecutionContext]时,Scala会使用测试中的隐式参数来填充它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接