2

我有一个名为“经理”的父演员,它创建了几个子演员。然后这些子actor通过“sender tell”发回他们的响应,即直接返回给“manager”。

我想为这个经理演员创建一个单元测试,因此需要注入一个探针来将消息从经理转发给它的孩子。

我使用了以下帖子: http ://www.superloopy.io/articles/2013/injecting-akka-testprobe.html

但是,我仍然无法正确完成此操作。

为了简化情况,附件是描述我只为一个孩子编写的演员和单元测试的代码。

经理类:

trait ManagerChildProvider {
  def createTimestampPointChild: Actor
}

trait ProductionManagerChildProvider extends ManagerChildProvider {
  def createTimestampPointChild = new TimeDifferenceCalculationActor 
}

object Manager {
  def apply() = new Manager("cid1") with ProductionManagerChildProvider
}

class Manager(name: String) extends Actor with ActorLogging {

  this: ManagerChildProvider =>

  @Autowired private val modelParams = new ModelParams //list of  parameters

  val timeDifference = context.actorOf(Props(createTimestampPointChild))

  def receive = {
    case p@TimePoint(tPoint) =>
      timeDifference ! p
    case _ =>
      log.error("Unknown message type")
  }
}

儿童班:

class TimeDifferenceCalculationActor extends Actor with ActorLogging {

  var previousTimestamp: Long = -1

  def receive = {
    case tPoint(timestamp) =>
          if (previousTimestamp != -1) {
            sender ! Result(1)
          }
    case _ =>
      log.error("Unknown message type")
  }
}

测试类:

object BarSpec {
  class Wrapper(target: ActorRef) extends Actor {
    def receive = {
      case x => target forward x
    }
  }
}

trait ChildrenProvider {
  def newFoo: Actor
}

class BarSpec extends TestKitSpec("BarSpec") {

  import Manager._
  import BarSpec._

trait TestCase {
    val probe = TestProbe()

    trait TestChildrenProvider extends ManagerChildProvider {
      def newBar = new Wrapper(probe.ref)
    }

    val actor = system.actorOf(Props(new Manager(componentId = "cid1") with TestChildrenProvider))
  }

  "Bar" should {
    "involve child in doing something" in new TestCase {

      actor ! tPoint(1)
      actor ! tPoint(2)

      probe.expectMsg(tPoint(1))
  //probe.reply("ReplyFromChild")
  //expectMsg("ReplyFromParent")
    }
  }
}

附加测试类:

abstract class TestKitSpec(name: String) extends TestKit(ActorSystem(name)) with MustMatchers with BeforeAndAfterAll with ImplicitSender with WordSpecLike{

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

目前我收到以下错误:

错误:(36, 42) 无法创建对象,因为未定义 > type => akka.actor.Actor 的 trait ManagerChildProvider 中的方法 > createTimestampPointChild val actor = system.actorOf(Props(new Manager(componentId = "cid1") 与TestChildrenProvider))

错误:(11, 16) 在类型 > (testName: Option[String], args: > org.scalatest.Args)org.scalatest.Status 的 trait BeforeAndAfterAll 中运行覆盖方法;方法在 trait WordSpecLike 类型 (testName: Option[String], > args: org.scalatest.Args)org.scalatest.Status 中运行需要 `abstract override' > 修饰符抽象类 TestKitSpec(name: String) extends > TestKit(ActorSystem(姓名))

对于这些特定错误或一般任务的任何帮助将不胜感激

4

0 回答 0