2016-05-01 47 views
3

以下问题的答案:https://stackoverflow.com/a/30806548/4496364 我在我的项目中使用了Play的ExecutionContext。Scala,PlayFramework,Mockito,ExecutionContext null

最近我需要使用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) 
     } 
    } 
    } 

} 

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

+0

也许这可能不是一个问题与ExecutionContext,但与'trait'?http://stackoverflow.com/questions/6243467/scala-and-mockito-with-traits?rq = 1 –

回答

3

万一有人找,答案是显而易见的......

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

我不熟悉的Mockito是如何工作的,或者使用Scala implicits。 当你不通过any[ExecutionContext]斯卡拉将填补测试隐含的一个。