由于我目前正在为我的 Akka 应用程序(http://doc.akka.io/docs/akka/snapshot/scala/testing.html)编写测试用例,我想知道是否有一种方法可以测试演员的界面。我的意思是,我想检查目标参与者的接收方法是否处理消息A。想象以下场景:
参与者 A 可以处理消息 b 和 c。演员 B 想将消息 b 和 a 发送给演员 A。为了确保这很好,我想编写一个测试用例来确保演员 A 正在处理消息 a 和 b。
由于我目前正在为我的 Akka 应用程序(http://doc.akka.io/docs/akka/snapshot/scala/testing.html)编写测试用例,我想知道是否有一种方法可以测试演员的界面。我的意思是,我想检查目标参与者的接收方法是否处理消息A。想象以下场景:
参与者 A 可以处理消息 b 和 c。演员 B 想将消息 b 和 a 发送给演员 A。为了确保这很好,我想编写一个测试用例来确保演员 A 正在处理消息 a 和 b。
这取决于你想测试什么。
由于该receive
方法是 a PartialFunction
,因此您可以isDefinedAt
像这样进行测试:
$ sbt test:console
scala> import akka.actor._
scala> import akka.testkit._
scala> class MyActor extends Actor {
def receive = {
case n: Long => println("Got %d".format(n))
case s: String => println("Got %s".format(s))
}
}
scala> implicit val system = ActorSystem()
system: akka.actor.ActorSystem = akka://default
scala> val myActor = TestActorRef[MyActor]
myActor: akka.testkit.TestActorRef[MyActor] = TestActor[akka://default/user/$$a]
scala> val underlying = myActor.underlyingActor
underlying: MyActor = MyActor@365d7762
scala> underlying.receive.isDefinedAt(123L)
res0: Boolean = true
scala> underlying.receive.isDefinedAt("banana")
res1: Boolean = true
scala> underlying.receive.isDefinedAt(true)
res2: Boolean = false
scala> underlying.receive.isDefinedAt(123)
res3: Boolean = false
scala> underlying.receive.isDefinedAt(null)
res4: Boolean = false
scala> system.shutdown()