Akka从道具中窃听消息流,IllegalArgumentException

时间:2013-12-09 21:06:34

标签: unit-testing akka

我有一个代表共享资源的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"
...        

1 个答案:

答案 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)) ) 

我会感到尴尬,除非这是一个非常容易犯的错误,我觉得我不会是唯一的错误。 将此留给后人。