在有限状态机中更新数据

时间:2018-03-29 15:30:47

标签: java akka fsm akka-testkit akka-fsm

我正在使用FSM框架和AKKA使用其Java API来管理状态转换。这是状态机的相关部分

onTansition()

这可以按预期工作,并且actor会发生正确的状态更改。在Service.setProperty(someProperty) dbActor.tell(saveService); 块中,我想更新Service对象,在这种情况下是有限状态机数据,如下所示

 onTransition(matchState(QUEUED,ERROR, () -> {
      nextStateData().setServiceStatus(ERROR);
      // Get the actual exception message here to save to the database
      databaseWriter.tell(nextStateData(), getSelf());

    }));

这可能吗?我是否以正确的方式使用此框架?

我想我能够做类似以下的事情

   @Test
      public void testErrorState() {
        new TestKit(system) {
          {
            TestProbe probe = new TestProbe(system);
            final ActorRef underTest = system.actorOf(ServiceFSMActor.props(dbWriter));
            underTest.tell(new Exception(), getRef());
            expectMsgEquals(ERROR); // This works
           // How do I make sure the data is updated here as part of the OnTransition declaration??

          }
        };
      }

我现在如何实际测试因此转换而更改的数据?

测试看起来像这样

{{1}}

1 个答案:

答案 0 :(得分:2)

您已在测试中定义了探针,但您没有使用它。由于FSM actor将更新后的状态发送给数据库编写器actor,因此可以通过用探测器替换数据库编写器actor来测试更新状态:

new TestKit(system) {{
  final TestProbe probe = new TestProbe(system);

  final ActorRef underTest = system.actorOf(ServiceFSMActor.props(probe.ref()));
  underTest.tell(new Exception(), getRef());
  expectMsgEquals(ERROR);

  final Service state = probe.expectMsgClass(Service.class);
  assertEquals(ERROR, state.getServiceStatus());
}};