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

Akka FSM和TestKit将共享测试放入Trait中,使发送者成为最后期限

沈树
2023-03-14

我试图将一些常见的Akka FSM代码的一些常见测试纳入一个特征,但是发送者引用正在变成deadletters。使用以下FSM代码:

import akka.actor.FSM
import akka.testkit.TestFSMRef
import akka.testkit.TestKit
import akka.actor.ActorSystem
import org.scalatest.Matchers
import org.scalatest.WordSpecLike
import akka.testkit.ImplicitSender

sealed trait MyState
case object StateA extends MyState
case object StateB extends MyState

case class MyData(ignored: Option[Int] = None)

class MyFSM extends FSM[MyState, MyData] {
  startWith(StateA, MyData())

  val common: StateFunction = {
    case Event(_, _) =>
      System.err.println(s"sender is $sender")
      sender ! s"hello $stateName"
      stay
  }

  when(StateA)(common)

  when(StateB)(common)
}
class StateASpec extends TestKit(ActorSystem()) with WordSpecLike with Matchers with ImplicitSender {

  def testCommonBehaviour(testState: MyState) {
    val fsm = TestFSMRef(new MyFSM())
    fsm.setState(testState, MyData())
    fsm ! "hello fsm"
    expectMsg("hello StateA")
  }

  "StateA" should {
    "respond to common test case" in {
      testCommonBehaviour(StateA)
    }
  }
}

class StateBSpec extends TestKit(ActorSystem()) with WordSpecLike with Matchers with ImplicitSender {

  def testCommonBehaviour(testState: MyState) {
    val fsm = TestFSMRef(new MyFSM())
    fsm.setState(testState, MyData())
    fsm ! "hello fsm"
    expectMsg("hello StateB")
  }

  "StateB" should {
    "respond to common test case" in {
      testCommonBehaviour(StateB)
    }
  }
}

当我尝试将常见的测试逻辑转换成一个特征时:

trait TraitOfTests {
  self: TestKit with ImplicitSender =>

  def testCommonBehaviour(testState: MyState) {
    val fsm = TestFSMRef(new MyFSM())
    fsm.setState(testState, MyData())
    fsm ! "hello fsm"
    expectMsg("hello $testState")
  }
}

class StateASpec extends TestKit(ActorSystem()) with WordSpecLike with Matchers with ImplicitSender  with TraitOfTests {

  "StateA" should {
    "respond to common test case" in {
      testCommonBehaviour(StateA)
    }
  }
}

class StateBSpec extends TestKit(ActorSystem()) with WordSpecLike with Matchers with ImplicitSender  with TraitOfTests {

  "StateB" should {
    "respond to common test case" in {
      testCommonBehaviour(StateB)
    }
  }
}

回复给了截止日期演员:

发件人是参与者[Akka://default/deadletters][INFO][11/30/2014 16:15:49.812][default-Akka.actor.default-dispatcher-2][Akka://default/deadletters]从TestActor[Akka://default/user/$$b]到参与者[Akka://default/deadletters]的消息[java.lang.string]未传递。[1]遇到的一纸空文。可以通过配置设置'Akka.log-dead-letters'和'Akka.log-dead-letters-dhider-shutdown'关闭或调整此日志记录。

共有1个答案

陆琦
2023-03-14

解决这个问题的一个方法是对您的共同特征进行轻微的重新设计,如下所示:

trait TraitOfTests {
  self: TestKit =>

  def testCommonBehaviour(testState: MyState)(implicit sender:ActorRef) {
    val fsm = TestFSMRef(new MyFSM())
    fsm.setState(testState, MyData())
    fsm ! "hello fsm"
    expectMsg("hello $testState")
  }
}

如果您在TestCommonBehavior上定义了隐式发送器,那么您可以确信它将正确地从通过ImplicitSender使其可用的测试中提取它

 类似资料:
  • trait 允许我们进行另一种抽象:他们让我们可以抽象类型所通用的行为。trait 告诉 Rust 编译器某个特定类型拥有可能与其他类型共享的功能。在使用泛型类型参数的场景中,可以使用 trait bounds 在编译时指定泛型可以是任何实现了某个 trait 的类型,并由此在这个场景下拥有我们希望的功能。 注意:trait 类似于其他语言中的常被称为 接口(interfaces)的功能,虽然有一

  • 问题内容: 我有一个包含多个文件的Go包。从Go标准开始,我正在为包中的每个源文件创建一个关联的测试文件。 就我而言,不同的测试使用相同的测试帮助功能。我不希望这些功能出现在软件包源文件中,因为它仅用于测试目的。我也想避免在每个测试文件中复制此代码。 我应该把这些代码放在所有测试源文件之间共享而不是包的一部分中吗? 问题答案: 您只需将其放在任何测试文件中就可以了。使用相同package子句的测试

  • 因此,我按照如下方式进行定制。 Xamarin.from Android代码

  • 我可以有一个包含Springboot集成测试的罐子吗

  • 我正在使用TestKit测试一个Scala项目的一些类,这个项目涉及Akka Actor,我遇到了这个问题: 所讨论的类如下所示: 我以前没有这个问题,因为我有

  • 当单元测试共享首选项时,值是否为get refresh every test?