下面的答案是:https://stackoverflow.com/a/30806548/4496364,我在我的项目中使用了Play的ExecutionContext。
最近,我需要使用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
}测试:
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时,在Service中调用dao.findAll时会得到一个Service。起初,我认为Mockito无法处理Scala的未来,但我发现ExecutionContext是问题所在。既然我不是并发专家,能不能有人解释一下为什么会发生这种情况?
发布于 2016-07-03 14:15:03
如果有人在找答案很明显..。
import org.mockito.Matchers.any
..
mockDAO.findAll(any[ExecutionContext])我不熟悉Mockito是如何工作的,也不熟悉Scala的暗示。当您没有通过any[ExecutionContext]时,Scala将用测试中的隐式方法填充它。
https://stackoverflow.com/questions/36971704
复制相似问题