expectMsgAnyOf и expectMsgAllOf в наборе тестов Akka

avatar
Vadim
9 августа 2021 в 07:01
60
1
0

У меня есть набор тестов akka (классический) и методы expectMsgAnyOf и expectMsgAllOf в классе TestKit, которые позволяют мне проверить несколько сообщений:

    "reply to a greeting" in {
     labTestActor ! "greeting"
     expectMsgAnyOf("hi", "hello")
   }

   "reply with favorite tech" in {
     labTestActor ! "favoriteTech"
     expectMsgAllOf("Scala", "Akka")
   }

Я хочу переписать эти тесты с типизированным набором тестов Akka, но не могу найти эти методы в классах TestKit и TestProbe. Не могли бы вы помочь мне проверить последовательность сообщений и любое сообщение.

Источник

Ответы (1)

avatar
Levi Ramsey
9 августа 2021 в 15:27
0

Вы можете реализовать эквиваленты в виде

def expectMsgAnyOf[T](probe: TestProbe[T])(candidates: T*): Unit = {
  val c = candidates.toSet
  val nextMsg = probe.receiveMessage()
  if (!c(nextMsg)) {
    throw new AssertionError(s"Expected one of $c, got $nextMsg")
  }
}

def expectMsgAllOf[T](probe: TestProbe[T])(expected: T*): Unit = {
  import scala.collection.mutable.Buffer

  val e = Buffer(expected: _*)
  val nextMsgs = probe.receiveMessages(candidates.size)
  nextMsgs.foreach { msg =>
    val idx = e.indexOf(msg)
    if (idx == -1) {
      throw new AssertionError(s"Received unexpected message: $msg")
    }
    e.remove(idx)
  }

  if (e.nonEmpty) {
    throw new AssertionError(s"Expected messages not received: ${e.mkString(",")}")
  }
}