我有一个名为“经理”的父演员,它创建了几个子演员。然后这些子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(姓名))
对于这些特定错误或一般任务的任何帮助将不胜感激