你如何模拟将使用地图功能的未来?

sub*_*oid 1 scala future mockito couchbase specs2

我正在尝试对以下的couchbase方法调用进行单元测试,我在SO中找不到满意的样本,所以我想我会发一个问题....

def getUserSession(token: String, ipAddr: String, userAgent: Option[String]): Future[Option[UserSession]] = {
    val query = new Query().setIncludeDocs(true).setLimit(1)
      .setRangeStart(ComplexKey.of(token))
      .setRangeEnd(ComplexKey.of(s"$token\uefff"))
      .setStale(Stale.FALSE)
    bucket.find[UserSession](DOC_NAME, VIEW_BY_TOKEN)(query).map(_.headOption) map {
      userSessionOpt => {
    userSessionOpt filter {
      userSession =>
        (userSession.ipAddr == ipAddr) &&
          (!userAgent.isDefined || !userSession.userAgent.isDefined || userSession.userAgent == userAgent)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

}

所以这是我的尝试,我的单元测试摘录:

  val mockQueryResult = mock[Future[List[UserSession]]]
  val mockUserSessionList = mock[List[UserSession]]
  val mockUserSession = mock[UserSession]

  // This is just my trial and erros
  mockUserSessionList.head returns mockUserSession
  mockUserSessionList(0) returns mockUserSession

  Await.result(mockQueryResult, Duration(60, SECONDS)) returns mockUserSessionList

  mockBucket.find[UserSession](any[String], any[String])(any[Query])(any[Reads[UserSession]], any[ExecutionContext]) returns mockQueryResult

  val queryCaptor = capture[Query]
  val readsCaptor = capture[Reads[UserSession]]
  val executionContextCaptor = capture[ExecutionContext]
  val docNameCaptor = capture[String]
  val viewNameCaptor = capture[String]

  userSessionRepositoryWithMockBucket.getUserSession(TEST_SESSION_TOKEN1, TEST_IP_ADDR1, TEST_USER_AGENT)

  there was one(mockBucket).find[UserSession](docNameCaptor, viewNameCaptor)(queryCaptor)(readsCaptor, executionContextCaptor)
Run Code Online (Sandbox Code Playgroud)

现在在bucket.find方法调用的某个时刻调用NPE.我做了一点挖掘,看起来Await.result回报嘲弄并没有真正起作用,map可能是因为显而易见的原因.如果我修改了我要使用的getUserSession函数,它会返回结果Await.result.我只是试一试,因为我没有创造性地想出其他方法(这对我来说是新的).

似乎有一种不那么冗长的方式来进行嘲弄,而不是必须做所有的层次Future[List[UserSession]].谢谢你的时间!

sub*_*oid 5

我想我可能已经找到了如何使用地图操作模拟未来工作的答案.似乎如果我们创建一个"成功的"Future,它将如下工作:

  val mockUserSession = createTestUserSession
  val mockUserSessionList = mock[List[UserSession]]
  val mockUserSessionListFuture = Future.successful[List[UserSession]](mockUserSessionList)

  mockUserSessionList.headOption returns Some(mockUserSession)
Run Code Online (Sandbox Code Playgroud)

这将反过来允许向地图getUserSession提供适当的实例headOption,在这种情况下是实例Some(mockUserSession)