我正在使用带有 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 社区对可能出现的问题有任何想法吗?