首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Akka TestKit中创建TestKit的时间

在Akka TestKit中创建TestKit的时间
EN

Stack Overflow用户
提问于 2014-10-22 13:10:45
回答 1查看 373关注 0票数 1

我有在测试中重写actorOf的特性:

代码语言:javascript
复制
trait ActorRefFactory {
  this: Actor =>

  def actorOf(props: Props) = context.actorOf(props)
}

我有一位演员,当我收到任何信息时,他们会停止自我:

代码语言:javascript
复制
class WorkerActor extends Actor {
  override def receive: Actor.Receive = {
    case _ => { context.stop(self) }
  }
}

此外,我还有一位演员大师,他创造演员,并将他们放在队列中:

代码语言:javascript
复制
class MasterActor extends Actor with ActorRefFactory {
  var workers = Set.empty[ActorRef]

  override val supervisorStrategy = SupervisorStrategy.stoppingStrategy

  def createWorker() = {
    val worker = context watch actorOf(Props(classOf[WorkerActor]))
    workers += worker
    worker
  }

  override def receive: Receive = {
    case m: String =>
      createWorker()
    case Terminated(ref) =>
      workers -= ref
      createWorker()
  }
}

这个测试失败了:

代码语言:javascript
复制
class ActorTest(val _system: ActorSystem) extends akka.testkit.TestKit(_system)
  with ImplicitSender
  with Matchers
  with FlatSpecLike {

  def this() = this(ActorSystem("test"))

  def fixture = new {
    val master = TestActorRef(new MasterActor() {
      override def actorOf(props: Props) = TestProbe().ref
    })
  }

  it should "NOT FAILED" in {
    val f = fixture

    f.master ! "create"
    f.master ! "create"

    f.master.underlyingActor.workers.size shouldBe 2

    val worker = f.master.underlyingActor.workers.head
    system.stop(worker)
    Thread.sleep(100)

    f.master.underlyingActor.workers.size shouldBe 2
  }

}

在测试Thread.sleep之后,我给出了"1不等于2“的错误。我不知道发生了什么。但是,如果猜测我可以假设TestProbe()不能在时间内创建。我能做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-22 19:46:02

这基本上归结为一个异步问题,您希望在Akka的单元测试中尽量避免这个问题。您正确地使用了TestActorRef来连接到master参与者的CallingThreadDispatcher中。但是,当您调用system.stop(worker)时,system仍然使用默认的异步调度程序,它将在停止时引入此争用条件,然后重新创建一个工作人员。要想始终如一地解决这个问题,我能看到的最简单的方法是像这样阻止工人:

代码语言:javascript
复制
master.underlyingActor.context.stop(worker)

因为您使用的是context of master,而该参与者正在使用CallingThreadDispatcher,所以我相信这将消除您正在看到的asnyc问题。当我试着的时候它对我有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26508226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档