我有一个演员代表一个共享的资源。worker Actor以下列方式接受它作为构造函数参数:
class Worker(G: ActorRef) extends Actor {
G ! Graph.Look(start)
...
}我试图为员工/资源交互设计测试代码,但没有达到以下目的:
val probe = TestProbe()
val worker = system.actorOf( Props(classOf[Worker], probe.ref))
probe.expectMsg(Look(0))其目的是检查对G的每个请求,并将其转发给真正的参与者,观察很少迭代的结果。但是,上面的代码会导致这个运行时错误:
java.lang.IllegalArgumentException: no matching constructor found on class Worker for arguments [class akka.actor.RepointableActorRef]如果这不是测试这种交互循环的正确方法,那么还有什么可供选择的呢?
build.sbt:
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % "2.2.3"
, "com.typesafe.akka" %% "akka-testkit" % "2.2.3"
... 发布于 2013-12-10 04:32:15
最初的问题是错误的。我的实际工作人员有两个参数:
class Worker(G: ActorRef, startState: Int) extends Actor {...正在发生的情况是,带有ClassTag调用的道具正在将编译时错误转换为运行时错误:
val worker = system.actorOf( Props(classOf[Worker], probe.ref))应该是
val worker = system.actorOf( Props(classOf[Worker], probe.ref, 0))运行时错误产生,就像在最初的问题中一样,有点令人困惑,因为它听起来好像存在类型错配,而且akka.actor.RepointableActorRef在某个时候扩展了ActorRef。实际上,不匹配的是整个构造函数签名。
这有点令人沮丧,因为这个错误“升级”是我在避免现在不再推荐的语法时注意到的:
val worker = system.actorOf( Props(new Worker(probe.ref, 0)) ) 我会感到很尴尬,除非这是一个很容易犯的错误,我觉得我不会是唯一一个。把这个留给后人。
https://stackoverflow.com/questions/20480791
复制相似问题