当前位置: 首页 > 知识库问答 >
问题:

测试创建子参与者的参与者

仇高韵
2023-03-14

例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确?

class ParentActor extends Actor {
  case class CreateChildren(count: Int)

  override def receive: Receive = {
    case CreateChildren(count) => for (_ <- 0 until count) context.actorOf(Props[ChildActor])
  }
}

class ChildActor extends Actor {
  override def receive: Receive = {
    case _ =>
  }
}

更新:基于@Tim answer的解决方案

更改类别:

class ParentActor(childActorFactory: ChildActorFactory) extends Actor {
  override def receive: Receive = {
    case CreateChildren(count) => for (_ <- 0 until count) childActorFactory.create(context)
  }
}

object ParentActor {
  def props(childActorFactory: ChildActorFactory): Props = Props(new ParentActor(childActorFactory))
}

class ChildActorFactory {
  def create(context: ActorContext): ActorRef = context.actorOf(Props[ChildActor])
}

测试:

"ParentActor" should {
    "instantiate ten child actors" in {
      val childrenCount = 10
      val childActorFactory = mock[ChildActorFactory]
      val parentActor = TestActorRef[ParentActor](ParentActor.props(childActorFactory))

      parentActor ! CreateChildren(childrenCount)

      Mockito.verify(childActorFactory, Mockito.times(childrenCount))
        .create(parentActor.underlyingActor.context)
    }
  }

共有2个答案

柯镜
2023-03-14

确保创建子角色的最简单方法是重写ChildActor中的preStart()方法

class ChildActor extendsActor with ActorLogging {
  override def preStart(): Unit = log.info("Child created")
def receive(): Receive = // whatever
}

因此,每次向系统添加子角色时,您都会看到该消息

党源
2023-03-14

如果要完全测试父参与者,则需要模拟子参与者,因此不能直接在父参与者中创建子参与者。相反,将工厂方法传递给父参与者(依赖项注入):

class ParentActor(makeChild: () => ChildActor) extends Actor {
  case class CreateChildren(count: Int)

  override def receive: Receive = {
    case CreateChildren(count) => for (_ <- 0 until count) makeChild() 
  }
}

makeChild函数可以计算创建的参与者数量。它还可以返回一个模拟版本的ChildActor,该版本实现了测试行为,以强调ParentActor

 类似资料:
  • 执行者即任务需要执行的人或者涉及到任务协同时的主要负责人,每个任务对应唯一执行者。参与者指的是需要关注进展的成员或协同任务的执行人。创建者指的是创建当前任务的人。任务的创建者默认为任务的参与者。

  • 参与者可以使用API或命令行添加到参与者库中。 在你开始之前 在你执行这些步骤之前,你在业务网络定义中必须建模一个参与者,并将其部署为业务网络。 下面的过程显示了一个使用以下数字财产范例业务网络定义的参与者模型的示例:digitalproperty-network 请注意:如果你使用composer participant add命令添加参与者,请确保参与者的JSON陈述包裹在单引号中。 name

  • 我有一个AKKA模型,有一个主管演员,他创造了许多儿童演员。子参与者将处理一个事件并将消息发送到另一个服务(例如Kafka topic)。 目前,我有一个静态共享类,它在子参与者之间共享以发送消息,但在参与者模型中,我认为最好使用参与者来实现这一目的。 我想知道我如何才能创造一个演员,儿童演员可以分享它。如果supervisor actor创建了MessagePublisher actor,那么孩

  • composer participant add命令将参与者的新实例添加到参与者库中。查看“ 添加参与者 ”任务,了解使用此命令或API的演练。 data选项必须包含一个代表要添加的参与者的序列化JSON串,并且必须用单引号包裹。 句法 composer participant add composer participant add [options] Participant options

  • 概念 A Participant(参与者)是业务网络中的行为人(actor)。参与者可能是一个组织的分支。参与者可以创建资产,并与其他参与者交换资产。参与者通过提交交易来处理资产。 参与者拥有一组Identity文档,可以用来证明参与者的身份。例如,一个人可能有一个或多个以下身份文档证明他们是谁: 护照 驾驶执照 指纹 视网膜扫描 SSL证书 在Hyperledger Composer中,参与者可

  • 最近,我尝试为akka参与者编写一些单元测试,以测试参与者消息流。我在测试中观察到一些奇怪的行为: 下一个 在我的代码中,我有: 基本上,有时(很少)这样的测试失败(在另一个操作系统上),并且抛出processMessage方法的异常(由于业务逻辑导致的IllegalStateException)。