Akka FSM和TestKit将共享测试放入特质中,使发送者成为死信

Akka FSM和TestKit将共享测试放入特质中,使发送者成为死信,akka,akka-testkit,Akka,Akka Testkit,我试图将一些常见Akka FSM代码的常见测试因素考虑到一个特征中,但是发送方ref正在变成死信。使用此FSM代码: 导入akka.actor.FSM 导入akka.testkit.TestFSMRef 导入akka.testkit.testkit 导入akka.actor.ActorSystem 导入org.scalatest.Matchers 导入org.scalatest.WordSpecLike 导入akka.testkit.ImplicitSender 封闭性状肌醇状态 case对象S

我试图将一些常见Akka FSM代码的常见测试因素考虑到一个特征中,但是
发送方
ref正在变成
死信
。使用此FSM代码:

导入akka.actor.FSM
导入akka.testkit.TestFSMRef
导入akka.testkit.testkit
导入akka.actor.ActorSystem
导入org.scalatest.Matchers
导入org.scalatest.WordSpecLike
导入akka.testkit.ImplicitSender
封闭性状肌醇状态
case对象StateA扩展了MyState
case对象StateB扩展MyState
案例类MyData(忽略:选项[Int]=None)
类MyFSM扩展了FSM[MyState,MyData]{
startWith(StateA,MyData())
val公共:状态函数={
案例事件(,)=>
System.err.println(s“发件人为$sender”)
发件人!s“你好$stateName”
停留
}
何时(州)(普通)
何时(州B)(普通)
}
然后,我可以使用重复的测试代码在两个规范中测试两种状态的通用代码,使用:

class StateASpec使用WordSpecLike扩展了TestKit(ActorSystem()),并使用隐式搜索器扩展了Matchers{
def testcommonbehavior(testState:MyState){
val fsm=TestFSMRef(新的MyFSM())
fsm.setState(testState,MyData())
fsm!“你好,fsm”
expectMsg(“你好,StateA”)
}
“StateA”应该是{
中的“响应通用测试用例”{
TestCommonBehavior(StateA)
}
}
}
类stateBSec使用WordSpecLike扩展TestKit(ActorSystem()),并使用ImplicitSender扩展Matchers{
def testcommonbehavior(testState:MyState){
val fsm=TestFSMRef(新的MyFSM())
fsm.setState(testState,MyData())
fsm!“你好,fsm”
expectMsg(“你好,StateB”)
}
“StateB”应该是{
中的“响应通用测试用例”{
TestCommonBehavior(StateB)
}
}
}
当我试图将普通测试逻辑转化为特征时:

TraitOfTests{
self:TestKit与ImplicitSender=>
def testcommonbehavior(testState:MyState){
val fsm=TestFSMRef(新的MyFSM())
fsm.setState(testState,MyData())
fsm!“你好,fsm”
expectMsg(“hello$testState”)
}
}
类StateASpec使用WordSpecLike扩展TestKit(ActorSystem())并使用Matchers和ImplicitSender以及TraitOfTests{
“StateA”应该是{
中的“响应通用测试用例”{
TestCommonBehavior(StateA)
}
}
}
类StateBSec使用WordSpecLike和Matchers扩展TestKit(ActorSystem()),并使用ImplicitSender和TraitOfTests扩展Matchers{
“StateB”应该是{
中的“响应通用测试用例”{
TestCommonBehavior(StateB)
}
}
}
回答将发送给deadLetters参与者:

发送者是演员[akka://default/deadLetters][信息][11/30/2014 16:15:49.812][default akka.actor.default-dispatcher-2] [akka://default/deadLetters]来自的消息[java.lang.String] 测试者[akka://default/user/$$b]至 演员[akka://default/deadLetters]没有交货。[1] 死信 遇到。可以使用关闭或调整此日志记录 配置设置“akka.log死信”和 “akka.关闭期间记录死信”


我如何修复隐式发送器,以确保当FSM参与者从trait中响应test make的调用时,它会返回到testActor,以便
expectMsg
工作

解决此问题的一种方法是对您的共同特征进行轻微的重新设计,如:

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