0

我正在使用带有 TestKit 和 Scalatest 的 Akka 2.4.2 来编写和测试演员。每当我检查我的演员封装的一些可变状态时,似乎都会出现竞争条件。我有一个非常简单的演员,可以在远程数据库中保存一些状态:

class MyActor(dao: MyDao) extends Actor {
  var state: String = ""
  def receive = {
    case Set(str) => 
      state = str
      dao.save(state)
  }
}

DAO 方法具有类型签名dao.save(s:String): Future[String]。对数据库的调用是异步的,并且是在设置之后进行的state = str,因此似乎没有任何东西会阻止该字符串的分配。演员伴随着一个单元测试:

it should "set mutable state" in {
  val ref = TestActorRef(new MyActor(new MockDao))
  ref ! Set("foo")
  ref.underlyingActor.state shouldBe "foo"
}

如果我单独运行此测试,它将可靠地通过。然而,当我运行所有的演员测试(我有十几个不同的演员)时,这个测试用例将不确定地通过/失败。因此,似乎发生了某种竞赛。我正在使用默认的 Akka 配置。Akka 社区对可能出现的问题有任何想法吗?

4

0 回答 0