Обновление данных в конечном компьютере
Я использую инфраструктуру FSM с AKKA, используя его Java API для управления переходами между состояниями. Вот соответствующая часть состояния машины
when(QUEUED,
matchEvent(Exception.class, Service.class,
(exception, dservice) -> goTo(ERROR)
.replying(ERROR)));
// TODO:It seems missing from the DOC that to transition from a state , every state must be
// listed
// a service is in a errored state
when(ERROR,
matchAnyEvent((state, data) -> stay().replying("Staying in Errored state")));
onTransition(matchState(QUEUED, ERROR, () -> {
// Update the Service object and save it to the database
}));
Это работает, как ожидалось, и с актером происходят правильные изменения состояния. В onTansition()
блок, я хочу обновить объект службы, который в данном случае является данными конечного автомата, что-то вроде следующего
Service.setProperty(someProperty)
dbActor.tell(saveService);
Это возможно? Я правильно использую этот фреймворк?
Я думаю, что смог сделать что-то вроде следующего
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 ответ
Вы определили зонд в тесте, но не используете его. Поскольку субъект FSM отправляет обновленное состояние субъекту записи в базу данных, вы можете проверить обновленное состояние, заменив субъект записи в базе данных проверкой:
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());
}};