Мой простой тест актера akka не проходит, что я делаю не так? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь проверить этого простого актера:

object Notify {
  def props(incidentId: Int): Props = Props(new Notify(incidentId: Int))


  final case class Send(reportId: Int)
}

class Notify(incidentId: Int) extends Actor with ActorLogging {
  import Notify._

  log.info("Notify constructor...")

//  val x = 0
//  val y = 123 / x

  override def receive: Receive = {
    case Send(reportId) =>
      log.debug(s"Notify Send $reportId")
  }

}

Я получаю эту ошибку:

  • должен efg * FAILED * [info] java.lang.AssertionError: утверждение не выполнено: тайм-аут (3 секунды) во время ожидаемого сообщения (123) [info] в scala.Predef $ .assert (Predef.scala: 170) [info] в akka.testkit.TestKitBase $ class.expectMsg_internal (TestKit.scala: 402) [info] в akka.testkit.TestKitBase $ class.expectMsg (TestKit.scala: 379) [info]
    в akka.testkit.TestKit.expectMsg (TestKit.scala: 896) [info] в TestKitUsageSpec $$ anonfun $ 1 $$ anonfun $ apply $ mcV $ sp $ 5.apply (ActorSpec.scala: 49) [info] в TestKitUsageSpec $$ anonfun $ 1 $$ anonfun $ применить $ mcV $ sp $ 5.apply (ActorSpec.scala: 47) [info] at org.scalatest.OutcomeOf $ class.outcomeOf (OutcomeOf.scala: 85) [info]
    в org.scalatest.OutcomeOf $ .outcomeOf (OutcomeOf.scala: 104)) [info] at org.scalatest.Transformer.apply (Transformer.scala: 22) [info] at org.scalatest.Transformer.apply (Transformer.scala: 20)

Myакктестовая установка выглядит следующим образом:

import scala.util.Random

import org.scalatest.BeforeAndAfterAll
import org.scalatest.WordSpecLike
import org.scalatest.Matchers

import com.typesafe.config.ConfigFactory

import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.ActorSystem
import akka.actor.Props
import akka.testkit.{ TestActors, DefaultTimeout, ImplicitSender, TestKit, TestProbe }
import scala.concurrent.duration._
import scala.collection.immutable

import com.example.notifications._

class TestKitUsageSpec
  extends TestKit(ActorSystem(
    "TestKitUsageSpec",
    ConfigFactory.parseString(TestKitUsageSpec.config)))
    with DefaultTimeout with ImplicitSender
    with WordSpecLike with Matchers with BeforeAndAfterAll {
  import TestKitUsageSpec._

  val echoRef = system.actorOf(TestActors.echoActorProps)
  val forwardRef = system.actorOf(Props(classOf[ForwardingActor], testActor))
  val filterRef = system.actorOf(Props(classOf[FilteringActor], testActor))
  val randomHead = Random.nextInt(6)
  val randomTail = Random.nextInt(10)
  val headList = immutable.Seq().padTo(randomHead, "0")
  val tailList = immutable.Seq().padTo(randomTail, "1")
  val seqRef =
    system.actorOf(Props(classOf[SequencingActor], testActor, headList, tailList))

  val notifyActor = system.actorOf(Notify.props(123))

  override def afterAll {
    shutdown()
  }

  "a b c d " should {
    "e f g" in {
      notifyActor ! Notify.Send(123)
      expectMsg(Notify.Send(123))
    }
  }

1 Ответ

0 голосов
/ 02 января 2019

В своем тесте вы отправляете сообщение своему актеру (notifyActor ! Notify.Send(123)), а затем проверяете, отвечает ли ваш актер тем же сообщением (expectMsg(Notify.Send(123))).

Ваш примерный актер не отвечаетна запросы.Поэтому ваш тест перестает ждать ответа с исключением из-за тайм-аута.

Чтобы запустить тест, вы должны позволить своему субъекту отвечать на запросы.Вы можете сделать это, добавив к методу получения: sender ! Notify.Send(123).

...