Я бы предпочел создать экземпляр Machine1 и передать его какому-нибудь Builder, Configurator или Adapter, чтобы получить экземпляр StateMachine <>.
Spring State Mahcine поддерживает аннотацииоснованная конфигурация для создания экземпляров (например, через адаптер ) или Builder - других вариантов нет.
Использование @SpringBootTest(clasess = <YourEnumSMConfig>
определенно не создает полный контекст приложения:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Machine1.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class StateMachineTests {
@Autowired
private StateMachine<String, String> machine1;
@Test
public void testInitialState() throws Exception {
StatMachineTestPlan<SimState, SimEvent> plan = StateMachineTestPlanBuilder.<SimState, SimEvent>builder()
.defaultAwaitTime(2)
.stateMachine(machine1)
.step()
.expectStateChange(1)
.expectStateEntered(SimState.INITIAL)
.expectState(SimState.INITIAL)
.and()
.build()
plan.test();
}
}
Теперь я хочу создать тестыдля него.
Тестирование с TestPlanBuilder:
Из коробки есть поддержка тестирования для тестирования конечного автомата пружины.Это называется StateMachineTestPlan
.Вы можете построить StateMachineTestPlan
, используя StateMachineTestPlanBuilder
.
Доступ к этим классам вы можете получить, объявив следующую зависимость:
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-test</artifactId>
<version>2.0.3.RELEASE</version> // change version to match yours
<scope>test</scope>
</dependency>
Подробная официальная документация относительнотестирование доступно здесь .
Я бы предпочел не иметь неявного вызова getBean ("machine1")"через StateMachineFactory.getStateMachine (" machine1 "), для которого потребуется контекст приложения.
Создание SM с помощью Builder не требует любого контекст Spring.
public class TestEventNotAccepted {
@Test
public void testEventNotAccepted() throws Exception {
StateMachine<String, String> machine = buildMachine();
StateMachineTestPlan<String, String> plan =
StateMachineTestPlanBuilder.<String, String>builder()
.defaultAwaitTime(2)
.stateMachine(machine)
.step()
.expectStates("SI")
.and()
.step()
.sendEvent("E2")
.and()
.build();
plan.test();
}
private StateMachine<String, String> buildMachine() throws Exception {
StateMachineBuilder.Builder<String, String> builder = StateMachineBuilder.builder();
builder.configureConfiguration()
.withConfiguration()
.taskExecutor(new SyncTaskExecutor())
.listener(customListener())
.autoStartup(true);
builder.configureStates()
.withStates()
.initial("SI")
.state("S1")
.state("S2");
builder.configureTransitions()
.withExternal()
.source("SI").target("S1")
.event("E1")
.action(c -> c.getExtendedState().getVariables().put("key1", "value1"))
.and()
.withExternal()
.source("S1").target("S2").event("E2");
return builder.build();
}
private StateMachineListener<String, String> customListener() {
return new StateMachineListenerAdapter<String, String>() {
@Override
public void eventNotAccepted(Message event) {
System.out.println("EVENT NOT ACCEPTED: " + event);
}
};
}