2016-05-01 46 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]斯卡拉將填補測試隱含的一個。