【问题标题】:Akka tapping into message stream, IllegalArgumentException from PropsAkka 进入消息流,来自 Props 的 IllegalArgumentException
【发布时间】:2013-12-10 12:33:55
【问题描述】:

我有一个代表共享资源的演员。工作者 Actor 通过以下方式接受它作为构造函数参数:

class Worker(G: ActorRef) extends Actor {
    G ! Graph.Look(start)
    ...
}

我正在尝试为 Worker/Resource 交互设计测试代码,但未能达到:

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"
...        

【问题讨论】:

  • Worker 是内部类吗?如果是这样,它需要 this 在其构造函数中指向外部类的指针(是的,真的)。
  • 情况并非如此,但请牢记在心,以备不时之需。谢谢。

标签: unit-testing akka


【解决方案1】:

原来的问题是错误。我的实际工人有两个参数:

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

我会很尴尬,除非这是一个非常容易犯的错误,我觉得我不会是唯一一个。 留在这里留给后代。

【讨论】:

  • 哈哈 绝对不尴尬!这是一个非常容易犯的错误。因此,可以在here 找到推荐的做法。使用这种伴随对象的方法加上一个方便的方法,你可以保证你会在编译时而不是运行时找到这些家伙。
猜你喜欢
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2021-07-09
  • 2015-08-27
  • 2013-04-30
相关资源
最近更新 更多