この回答に続く: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
}
テスト:Service
で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)
}
}
}
}
注テスト中のコメントは、私はNullPointException
得ます。最初は私はMockitoがScalaのFuturesを扱うことができないと考えましたが、ExecutionContext
が問題であると分かりました。私は並行性の専門家ではないので、誰かがなぜこのようなことが起こるのか説明してください。
ExecutionContextではなく、「trait」で問題になる可能性がありますか?http://stackoverflow.com/questions/6243467/scala-and-mockito-with-traits?rq = 1 –