From 99688e9b19bc1bc2f5c06996b3d988ce42d5ec34 Mon Sep 17 00:00:00 2001 From: Danil Kornishev Date: Thu, 30 Mar 2017 16:27:22 -0400 Subject: [PATCH] Spring State Machine x3 (#1538) * [Fix] Move stateDo onto a separate state * Change tests to spring runner --- spring-state-machine/pom.xml | 7 +++- .../SimpleStateMachineConfiguration.java | 21 ++++++++--- .../ForkJoinStateMachineTest.java | 29 +++++++++++---- .../HierarchicalStateMachineTest.java | 27 +++++++++++--- .../JunctionStateMachineTest.java | 26 +++++++++++-- .../statemachine/StateEnumMachineTest.java | 17 ++++++++- .../StateMachineIntegrationTest.java | 37 ++++++++++++++----- 7 files changed, 130 insertions(+), 34 deletions(-) diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index bec03c39e8..f04d706d47 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -21,10 +21,15 @@ spring-statemachine-core 1.2.3.RELEASE + + org.springframework + spring-test + 4.3.7.RELEASE + junit junit - 4.11 + 4.12 test diff --git a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java index e9b448f6e7..f6c7991cf6 100644 --- a/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java +++ b/spring-state-machine/src/main/java/com/baeldung/spring/statemachine/config/SimpleStateMachineConfiguration.java @@ -36,10 +36,10 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt .initial("SI") .end("SF") .states(new HashSet<>(Arrays.asList("S1", "S2"))) - .state("S4", executeAction(), errorAction()) .stateEntry("S3", entryAction()) - .stateDo("S3", executeAction()) - .stateExit("S3", exitAction()); + .stateExit("S3", exitAction()) + .state("S4", executeAction(), errorAction()) + .stateDo("S5", executeAction()); } @@ -52,9 +52,11 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt .and().withExternal() .source("SI").target("S3").event("E3") .and().withExternal() - .source("S3").target("S4").event("E4").and().withExternal().source("S4").target("SF").event("end").guard(simpleGuard()) + .source("S3").target("S4").event("E4") .and().withExternal() - .source("S2").target("SF").event("end"); + .source("S4").target("S5").event("E5") + .and().withExternal() + .source("S5").target("SF").event("end").guard(simpleGuard()); } @Bean @@ -73,9 +75,16 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt } @Bean - public Action executeAction() { + public Action doAction() { return (ctx) -> { LOGGER.info("Do " + ctx.getTarget().getId()); + }; + } + + @Bean + public Action executeAction() { + return (ctx) -> { + LOGGER.info("Execute " + ctx.getTarget().getId()); int approvals = (int) ctx.getExtendedState().getVariables().getOrDefault("approvalCount", 0); approvals++; ctx.getExtendedState().getVariables().put("approvalCount", approvals); diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/ForkJoinStateMachineTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/ForkJoinStateMachineTest.java index 7b4b1928ea..03cb101a9d 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/ForkJoinStateMachineTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/ForkJoinStateMachineTest.java @@ -1,23 +1,36 @@ package com.baeldung.spring.statemachine; import com.baeldung.spring.statemachine.config.ForkJoinStateMachineConfiguration; +import com.baeldung.spring.statemachine.config.JunctionStateMachineConfiguration; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.statemachine.StateMachine; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import javax.annotation.Resource; import java.util.Arrays; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ForkJoinStateMachineConfiguration.class) public class ForkJoinStateMachineTest { + @Resource + private StateMachine stateMachine; + + @Before + public void setUp() { + stateMachine.start(); + } + @Test public void whenForkStateEntered_thenMultipleSubStatesEntered() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ForkJoinStateMachineConfiguration.class); - StateMachine stateMachine = ctx.getBean(StateMachine.class); - stateMachine.start(); - boolean success = stateMachine.sendEvent("E1"); assertTrue(success); @@ -27,9 +40,6 @@ public class ForkJoinStateMachineTest { @Test public void whenAllConfiguredJoinEntryStatesAreEntered_thenTransitionToJoinState() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ForkJoinStateMachineConfiguration.class); - StateMachine stateMachine = ctx.getBean(StateMachine.class); - stateMachine.start(); boolean success = stateMachine.sendEvent("E1"); @@ -41,4 +51,9 @@ public class ForkJoinStateMachineTest { assertTrue(stateMachine.sendEvent("sub2")); assertEquals("SJoin", stateMachine.getState().getId()); } + + @After + public void tearDown() { + stateMachine.stop(); + } } diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/HierarchicalStateMachineTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/HierarchicalStateMachineTest.java index d2944be173..950414bb0e 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/HierarchicalStateMachineTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/HierarchicalStateMachineTest.java @@ -1,23 +1,35 @@ package com.baeldung.spring.statemachine; import com.baeldung.spring.statemachine.config.HierarchicalStateMachineConfiguration; +import com.baeldung.spring.statemachine.config.JunctionStateMachineConfiguration; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.statemachine.StateMachine; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import javax.annotation.Resource; import java.util.Arrays; import static org.junit.Assert.assertEquals; - +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = HierarchicalStateMachineConfiguration.class) public class HierarchicalStateMachineTest { + @Resource + private StateMachine stateMachine; + + @Before + public void setUp() { + stateMachine.start(); + } + @Test public void whenTransitionToSubMachine_thenSubStateIsEntered() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(HierarchicalStateMachineConfiguration.class); - StateMachine stateMachine = ctx.getBean(StateMachine.class); - stateMachine.start(); - assertEquals(Arrays.asList("SI", "SUB1"), stateMachine.getState().getIds()); @@ -34,4 +46,9 @@ public class HierarchicalStateMachineTest { assertEquals(1, stateMachine.getState().getIds().size()); assertEquals("SF", stateMachine.getState().getId()); } + + @After + public void tearDown() { + stateMachine.stop(); + } } diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/JunctionStateMachineTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/JunctionStateMachineTest.java index f01683638b..64930162fd 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/JunctionStateMachineTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/JunctionStateMachineTest.java @@ -1,18 +1,33 @@ package com.baeldung.spring.statemachine; +import com.baeldung.spring.statemachine.config.JunctionStateMachineConfiguration; +import com.baeldung.spring.statemachine.config.SimpleEnumStateMachineConfiguration; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.statemachine.StateMachine; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import javax.annotation.Resource; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = JunctionStateMachineConfiguration.class) public class JunctionStateMachineTest { + @Resource + private StateMachine stateMachine; + + @Before + public void setUp() { + stateMachine.start(); + } + @Test public void whenTransitioningToJunction_thenArriveAtSubJunctionNode() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(com.baeldung.spring.statemachine.config.JunctionStateMachineConfiguration.class); - StateMachine stateMachine = ctx.getBean(StateMachine.class); - stateMachine.start(); stateMachine.sendEvent("E1"); Assert.assertEquals("low", stateMachine.getState().getId()); @@ -20,4 +35,9 @@ public class JunctionStateMachineTest { stateMachine.sendEvent("end"); Assert.assertEquals("SF", stateMachine.getState().getId()); } + + @After + public void tearDown() { + stateMachine.stop(); + } } diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateEnumMachineTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateEnumMachineTest.java index 257ed8768c..b7cbebe145 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateEnumMachineTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateEnumMachineTest.java @@ -3,22 +3,30 @@ package com.baeldung.spring.statemachine; import com.baeldung.spring.statemachine.applicationreview.ApplicationReviewEvents; import com.baeldung.spring.statemachine.applicationreview.ApplicationReviewStates; import com.baeldung.spring.statemachine.config.SimpleEnumStateMachineConfiguration; +import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; +import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.statemachine.StateMachine; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.Resource; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SimpleEnumStateMachineConfiguration.class) public class StateEnumMachineTest { + @Resource private StateMachine stateMachine; @Before public void setUp() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SimpleEnumStateMachineConfiguration.class); - stateMachine = ctx.getBean(StateMachine.class); stateMachine.start(); } @@ -29,4 +37,9 @@ public class StateEnumMachineTest { assertTrue(stateMachine.sendEvent(ApplicationReviewEvents.REJECT)); assertEquals(ApplicationReviewStates.REJECTED, stateMachine.getState().getId()); } + + @After + public void tearDown() { + stateMachine.stop(); + } } diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java index d7b26eeb97..8f61d93105 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java @@ -1,23 +1,31 @@ package com.baeldung.spring.statemachine; -import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.statemachine.StateMachine; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.statemachine.StateMachine; + +import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SimpleStateMachineConfiguration.class) public class StateMachineIntegrationTest { - private AnnotationConfigApplicationContext ctx; + @Resource private StateMachine stateMachine; @Before public void setUp() { - ctx = new AnnotationConfigApplicationContext(SimpleStateMachineConfiguration.class); - stateMachine = ctx.getBean(StateMachine.class); stateMachine.start(); } @@ -42,9 +50,18 @@ public class StateMachineIntegrationTest { assertTrue(acceptedE4); assertEquals("S4", stateMachine.getState().getId()); - assertEquals(2, stateMachine.getExtendedState().getVariables().get("approvalCount")); + + stateMachine.sendEvent("E5"); + assertEquals("S5", stateMachine.getState().getId()); stateMachine.sendEvent("end"); assertEquals("SF", stateMachine.getState().getId()); + + assertEquals(2, stateMachine.getExtendedState().getVariables().get("approvalCount")); + } + + @After + public void tearDown() { + stateMachine.stop(); } }