私は Akka 2.4.2 と TestKit および Scaltest を使用して、アクターの作成とテストを行っています。アクターによってカプセル化された可変状態を調べていると、常に競合状態が発生しているようです。リモート データベースに状態を保存する非常に単純なアクターがあります。
class MyActor(dao: MyDao) extends Actor {
var state: String = ""
def receive = {
case Set(str) =>
state = str
dao.save(state)
}
}
DAO メソッドの型は signaturedao.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"
}
このテストを個別に実行すると、確実に合格します。ただし、すべてのアクター テストを実行すると (12 種類のアクターがいます)、このテスト ケースは非決定論的に合格/不合格になります。そのため、ある種のレースが発生しているようです。デフォルトの Akka 構成を使用しています。何がうまくいかないのか、Akka コミュニティから何か考えはありますか?