标签: testkit

如何测试在Scala中创建的Akka actor

我正在尝试编写一个测试,以验证我的演员下面是创建heartBeatExpireWorker和heartBeatAccepter,但我不知道该怎么做.

首先,我想我可以使用Mockhito模拟或间谍代替上下文然后验证我调用了actorOf,但我无法找到一种方法来注入上下文而不破坏Akka测试框架.

然后,我想我可以向工人发送识别信息以验证它们是否存在.但是我发现这不起作用,因为Akka TestKit似乎没有创建被测试演员的儿童演员.它只能接受可以代表相邻参与者的Testprobes.

class HeartBeatPumpWorker(chatService: ChatService, target: HeartBeatMessageCmd) extends Actor with ActorLogging with
WorkersReference {

  val heartBeatInterval = chatService.getHeartBeatInterval

  val tick = context.system.scheduler.schedule(0 millis, heartBeatInterval millis, self, SendHeartBeat(target))

  override def postStop() = tick.cancel()

  def receive = {
    case SendHeartBeat(command: HeartBeatMessageCmd) =>
      log.debug("Sending heartbeat")
      //Send heartbeat to GWT
      val userTarget = NetworkWorker.buildEventUserTarget(command.getEventCode, command.getUser)

      val uuid: String = UUID.randomUUID().toString
      val freshCommand = new HeartBeatMessageCmd(command.getUser, command.getEventCode, uuid, command.getUserSession)
      networkWorker ! NetworkBroadcast(userTarget, freshCommand)

      val heartBeatId: String = freshCommand.getUuid
      //create expirer
      val heartBeatExpireWorkerRef = …
Run Code Online (Sandbox Code Playgroud)

scala akka scalatest testkit

10
推荐指数
2
解决办法
3095
查看次数

记录发送到Akka TestKit TestProbe的所有消息

我正在尝试记录TestKit TestProbe 收到的所有消息,这被证明有点困难.我知道文档中的Actor Logging部分,它说应该将该debug.receive选项与LogginReceive块结合使用.然而,当我无法控制演员的实现时,这不起作用.

我唯一的想法是继承akka.testkit.TestActor使用a LoggingReceive和子类TestKit来使它创建我的TestActor子类的实例,但是这不起作用,因为大多数功能都是akka命名空间的私有(并且有充分的理由,我想).

scala akka testkit

8
推荐指数
3
解决办法
2762
查看次数

Testkit / GradleRunner:如何使用代理?

对于常规 gradle 操作,gradle.properties我的项目或主页中有一个文件,用于配置代理详细信息(主机/端口等)

使用时GradleRunner,该gradle.properties文件会被有意忽略:
“默认 Gradle 用户主目录(例如 ~/.gradle/gradle.properties)中的任何配置都不会用于测试执行。TestKit 没有公开用于细粒度控制的机制环境的所有方面(例如 JDK)。TestKit 的未来版本将提供改进的配置选项。”

(来自https://docs.gradle.org/current/userguide/test_kit.html#sec:controlling_the_build_environment

问题:使用时
如何配置代理GradleRunner

gradle testkit gradle-plugin

5
推荐指数
1
解决办法
87
查看次数

如何在testKit中忽略单个测试

我在同一个类中进行了一系列测试,都测试了相同的功能,如何跳过/忽略一个,例如:

class FooTest(_system: ActorSystem) extends TestKit(_system)
with ImplicitSender
with WordSpecLike
with Matchers
{
  implicit val timeout = Timeout(10.seconds)

  def this() = this(ActorSystem("TESTActorSystem"))

  "Service " should {
     "test something" in {
        OK
      }
    }
     "test to be ignored " in{
      "Not implemented" //ignore this test
      }
}
Run Code Online (Sandbox Code Playgroud)

我确实使用了,registerIgnoredTest("test to be ignored")但我必须删除in.有更优雅的解决方案吗?像注释一样

scala akka testkit akka-testkit

3
推荐指数
1
解决办法
866
查看次数

Akka Scala TestKit 测试 PoisonPill 消息

假设我有一个Supervisor注入了childActor 的 Actor,如何向孩子发送 PoisonPill 消息并使用 TestKit 进行测试?

这是我的主管。

class Supervisor(child: ActorRef) extends Actor {

  ...
  child ! "hello"
  child ! PoisonPill
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码

val probe = TestProbe()
val supervisor = system.actorOf(Props(classOf[Supervisor], probe.ref))
probe.expectMsg("hello")
probe.expectMsg(PoisonPill)
Run Code Online (Sandbox Code Playgroud)

问题是PoisonPill没有收到消息。可能是因为探测被PoisonPill消息终止了?

断言失败

java.lang.AssertionError: assertion failed: timeout (3 seconds) 
during expectMsg while waiting for PoisonPill
Run Code Online (Sandbox Code Playgroud)

testing scala akka testkit

3
推荐指数
1
解决办法
1036
查看次数

Akka演员测试

由于我目前正在为我的Akka应用程序编写测试用例(http://doc.akka.io/docs/akka/snapshot/scala/testing.html),我想知道是否有办法测试一个actor 的界面.我的意思是,我想检查目标actor 的receive方法是否处理消息A或否.想象一下以下场景:

Actor A可以处理消息b和c.演员B想要向演员A发送消息b和a.为了确保这很好用,我想写一个测试用例,确保演员A正在处理消息a和b.

scala akka testkit

1
推荐指数
1
解决办法
352
查看次数