我有一个代表共享资源的actor。工作者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"
...
答案 0 :(得分:2)
最初的问题是错误。我的实际工作人员有两个参数:
class Worker(G: ActorRef, startState: Int) extends Actor {...
发生的事情是带有ClassTag调用的Props将编译时错误转换为运行时错误:
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)) )
我会感到尴尬,除非这是一个非常容易犯的错误,我觉得我不会是唯一的错误。 将此留给后人。