Akka:测试演员是否收到消息

5

我有下面的代码:

//TestActor got some message  
class TestActor extends Actor {

  def receive = {
    case string: String => //.... 
  }
}
//TestReg when create get ActorRef, when i call `pass` method, then should pass text to ActorRef
class TestReg(val actorRef: ActorRef) {
  def pass(text: String) {
   actorRef ! text
  }
}

当我编写测试时:

class TestActorReg extends TestKit(ActorSystem("system")) with ImplicitSender
   with FlatSpecLike with MustMatchers with BeforeAndAfterAll {

   override def afterAll() {
     system.shutdown()
   }

   "actorReg" should "pass text to actorRef" in {
      val probe = TestProbe()

      val testActor = system.actorOf(Props[TestActor])

      probe watch testActor

      val testReg = new TestReg(testActor)
      testReg.pass("test")

      probe.expectMsg("test")
   }
}

我遇到了错误:
java.lang.AssertionError: assertion failed: timeout (3 seconds) during expectMsg while waiting for test

如何检查演员收到了什么文本?
2个回答

6

probe.expectMsg()会对probe进行断言。但是你将testActor传递给了TestReg类。

更改为以下行,它将起作用:

val testReg = new TestReg(probe.ref) 

需要调用.ref方法将探针转换为ActorRef。您希望在此处执行此操作,而不是在变量实例化时执行,以避免超出此响应范围的某些错误。

我认为逻辑上的错误在于您认为watch方法使probe能够看到test actor所做的事情。但它是死亡监视而不是消息监视,这是不同的。


1
创建一个名为 application.conf 的文件,内容如下:
akka {
  test {
    timefactor = 1.0    
    filter-leeway = 999s
    single-expect-default = 999s
    default-timeout = 999s

    calling-thread-dispatcher {
      type = akka.testkit.CallingThreadDispatcherConfigurator
    }
  }

  actor {
    serializers {
      test-message-serializer = "akka.testkit.TestMessageSerializer"
    }

    serialization-identifiers {
      "akka.testkit.TestMessageSerializer" = 23
    }

    serialization-bindings {
      "akka.testkit.JavaSerializable" = java
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接