当前位置: 首页 > 知识库问答 >
问题:

Specs2具有未来结果的数据表

杨成礼
2023-03-14

我正在为以下问题而苦苦挣扎:我有一个返回Future[Result]的方法,其中Result是我想用specs2中的数据表行检查的东西。

据我所知,以下代码每次都会阻塞并等待结果可用。

def getDataForInput(input: String) : Future[Result]

def myTest =
 "input"   |  "expectedResult" |>
  "a"    !  123                |
  "b"      !  0                | {
    (input, result) => getDataForInput input must( beEqualTo(result).await )
  }

通常,我想异步进行所有调用,然后使用Future.sequence将Seq[Future[Result]]转换为Future[Seq[Result]],然后运行测试。

有什么合理的方法可以做到这一点吗?

共有1个答案

詹联
2023-03-14

没有简单的方法可以做到这一点,你需要解构和重建一些东西

type RowResult = (Seq[String], Result)

val table =
  "input"  |  "expectedResult" |
   "123"   !  123              |
   "0"     !  1                |
   "0"     !  0

// get a Future containing all rows and results
val results: Future[List[RowResult]] = table.rows.toList.traverseU { row =>
  getDataForInput(row.t1).map { i => 
    (row.showCells, (i must beEqualTo(row.t2)).toResult) 
  }
}

// check the results
results must beSuccessfulTable(table.titles).await

这使用了一个自定义匹配器,它可以更好地显示表格

// the TextTable does an even display of columns
import org.specs2.text.TextTable

def beSuccessfulTable(titles: Seq[String]): Matcher[List[RowResult]] = { values: List[RowResult] =>
  val overallSuccess = values.map(_._2).reduce(_ and _).isSuccess
  val headers = if (overallSuccess) titles else Seq("")++titles++Seq("")
  val table = TextTable(headers, values.map(resultLine.tupled))
  (overallSuccess, table.show)
}

// helper method
def resultLine = (line: Seq[String], result: Result) => {
  val message = if (result.isSuccess) "" else result.message
  result.status +: line :+ message
}
 类似资料:
  • 我用谷歌搜索了这个,但仍然无法得到一个坚实的理解。我找不到任何使用构造函数的特定示例 Java博士说 未来提交(可运行任务,T结果) 提交一个可运行任务以供执行,并返回一个表示该任务的未来。Future 的 get 方法将在成功完成后返回给定的结果。 看到这一点,我的理解是在任务完成后的未来任务。get(),它将返回传递的给定结果对象,该对象与“可运行”作业无关。这是一种“可运行”作业完成的信号。

  • 我正在为给定的主键查询Dynamo DB。主键由两个UUID字段(fieldUUID1、fieldUUID2)组成。对于上面的主键组合和值列表,我有很多查询要执行。为此,我使用异步CompletableFuture和ExecutorService,线程池大小为4。 在所有查询返回结果之后,这是

  • 我有两个不同的CompletableFuture,我喜欢并行运行(每个都有不同的返回类型),然后结合它们的结果: 现在我喜欢把dog.name 我想用 但我在这里很烂。

  • 我使用的是SpringBoot和SpringDataJPA,我有一个逻辑,它由3个数据库请求组成,我想并行运行。我想在将来用于此目的。 最后,我需要从5 db查询运行的结果中构建响应对象。 所以我创造了完全未来 那我打算用。与这个未来无关。但我对循环调用有问题。如何重写它以在每个请求中使用callable,我需要从请求中传递值,然后按键排序到map中?

  • 我有一个应用程序,通过点击按钮(该数字被定义)用户创建任务(可调用)做一些计算。我希望任务完成时能够做出反应。使用Future.get()阻止应用程序。有什么方法可以在Callable返回结果时做出反应吗?

  • 我有一个Scala future,它调用一个api并返回future,如果结果不正确,那么另一个api调用将与第一个future的结果一起提交并作为future返回。 这是我目前为止所拥有的。 但是如果我访问fut2结果,它会给出这样的结果: 有没有一种方法,我可以选择返回fot2,如果fot1的结果是不准确的? 编辑:第二个未来必须使用第一个未来来继续API调用。这就是我到目前为止所拥有的。