Akka Actor isTerminated устарел

Просто пишу модульный тест, чтобы убедиться, что актер отключается при определенных условиях, поэтому у меня есть такой тест:

    val tddTestActor = TestActorRef[MyActor](Props(classOf[MyActor], "param1"))
    tddTestActor ! someMessage
    tddTestActor.isTerminated shouldBe true

Я получаю предупреждение о том, что isTerminated устарело. Подсказка рекомендует использовать context.watch(), однако в модульном тесте у меня нет родительского актера или какого-либо контекста для наблюдения.

Каков наилучший способ проверки закрытия tddTestActor?


person Exie    schedule 29.03.2016    source источник
comment
Отличный ответ от cmbaxter, используйте TestProbe() для наблюдения за актером, а затем проверьте с помощью expectTerminated()   -  person Exie    schedule 30.03.2016


Ответы (1)


Я согласен, что просмотр — лучший способ сделать это. Когда я тестирую поведение остановки, я обычно использую TestProbe в качестве наблюдателя для проверки тестируемого актера. Скажем, у меня был очень простой Actor, определенный следующим образом:

class ActorToTest extends Actor{
  def receive = {
    case "foo" => 
      sender() ! "bar"
      context stop self
  }
}

Затем, используя spec2 в сочетании с TestKit от akka, я мог протестировать поведение остановки следующим образом:

class StopTest extends TestKit(ActorSystem()) with SpecificationLike with ImplicitSender{

  trait scoping extends Scope {
    val watcher = TestProbe()
    val actor = TestActorRef[ActorToTest]
    watcher.watch(actor)
  }

  "Sending the test actor a foo message" should{
    "respond with 'bar' and then stop" in new scoping{
      actor ! "foo"
      expectMsg("bar")
      watcher.expectTerminated(actor)
    }
  }

}
person cmbaxter    schedule 29.03.2016