2016-05-01 17 views
3

この回答に続く:https://stackoverflow.com/a/30806548/4496364 私は自分のプロジェクトでPlayのExecutionContextを使用します。Scala、PlayFramework、Mockito、ExecutionContext null

最近、PlayでいくつかのサービスをテストするためにMockitoを使用する必要がありました。それの ので、これは単純化されたバージョン:

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 
} 

テスト:Servicedao.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) 
     } 
    } 
    } 

} 

注テスト中のコメントは、私はNullPointException得ます。最初は私はMockitoがScalaのFuturesを扱うことができないと考えましたが、ExecutionContextが問題であると分かりました。私は並行性の専門家ではないので、誰かがなぜこのようなことが起こるのか説明してください。

+0

ExecutionContextではなく、「trait」で問題になる可能性がありますか?http://stackoverflow.com/questions/6243467/scala-and-mockito-with-traits?rq = 1 –

答えて

3

誰かが見ている場合は、その答えは、私はMockitoの仕組みで、またはScalaの暗黙に精通していないだった...

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

明らかでした。 あなたが合格しなかった場合any[ExecutionContext] Scalaはテストからの暗黙のものでスカラを埋めます。