我正在尝试编写一个测试,以验证我的演员下面是创建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) 我正在尝试记录TestKit TestProbe 收到的所有消息,这被证明有点困难.我知道文档中的Actor Logging部分,它说应该将该debug.receive选项与LogginReceive块结合使用.然而,当我无法控制演员的实现时,这不起作用.
我唯一的想法是继承akka.testkit.TestActor使用a LoggingReceive和子类TestKit来使它创建我的TestActor子类的实例,但是这不起作用,因为大多数功能都是akka命名空间的私有(并且有充分的理由,我想).
对于常规 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?
我在同一个类中进行了一系列测试,都测试了相同的功能,如何跳过/忽略一个,例如:
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.有更优雅的解决方案吗?像注释一样
假设我有一个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) 由于我目前正在为我的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.