scala测试akka参与者向db添加值

scala测试akka参与者向db添加值,scala,akka,actor,scalatest,Scala,Akka,Actor,Scalatest,我正在尝试使用参与者测试运行半集成测试,这涉及到对数据库的持久化。fooActor正在将孩子添加到db中。但我必须等待,直到使用Thread.sleep完成对数据库的持久化: "persist kids" in { fooActor ! addChildToParent(bar,foo) expectMsg("done") fooActor ! addChildToParent(buz,foo) expectMsg("done") Th

我正在尝试使用参与者测试运行半集成测试,这涉及到对数据库的持久化。fooActor正在将孩子添加到db中。但我必须等待,直到使用Thread.sleep完成对数据库的持久化:

"persist kids" in {
      fooActor ! addChildToParent(bar,foo)
      expectMsg("done")
      fooActor ! addChildToParent(buz,foo)
      expectMsg("done")
      Thread.sleep(2000)
      suggestionActor ! GetChildListForParent(foo)
      expectMsg(
        Some(List(bar,buz))
      )
    }

好吧,这很好,但我讨厌这样的事实,我必须使用踏板。睡眠(2000)。有什么方法可以最小化这种影响吗?

要最小化这种影响,可以使用
waitassert

awaitAssert {
  suggestionActor ! GetChildListForParent(foo)
  expectMsg(
    Some(List(bar,buz))
  )
}

只要没有收到预期的消息,就会重试给定的块。它继续重试,直到块未引发异常(在这种情况下,测试成功)或直到最大持续时间到期(在这种情况下,测试失败)。最大持续时间和间隔是
awaitsassert

的可选参数,我会尝试同步测试(),或者干脆避免这些类型的测试。我认为Akka的测试场景更倾向于隔离/单元测试,而不是“半集成”。如果你想做你自己的事情,你会花很多时间来反对这种观点(罗兰·库恩自己在关于这一点的帖子上的回答似乎表明了极简主义&带有单元测试的精心设计的代码是Akka的推荐用法)。在我自己的项目中,我有独立于repo测试的actor测试。