32. Testing Support
我们还添加了一组实用程序类来轻松测试状态机实例。 这些用于框架本身,但对最终用户也非常有用。
StateMachineTestPlanBuilder用于构建一个StateMachineTestPlan,然后有一个方法test()运行一个计划。 StateMachineTestPlanBuilder包含一个流畅的构建器api,可以将步骤添加到计划中,并且在这些步骤中,您可以发送事件并检查各种条件,如状态更改,转换和扩展状态变量。
让我们用下面的例子来简单介绍一下StateMachine的构建:
private StateMachine<String, String> buildMachine() throws Exception {
StateMachineBuilder.Builder<String, String> builder = StateMachineBuilder.builder();
builder.configureConfiguration()
.withConfiguration()
.taskExecutor(new SyncTaskExecutor())
.autoStartup(true);
builder.configureStates()
.withStates()
.initial("SI")
.state("S1");
builder.configureTransitions()
.withExternal()
.source("SI").target("S1")
.event("E1")
.action(c -> {
c.getExtendedState().getVariables().put("key1", "value1");
});
return builder.build();
}
在下面的测试计划中,我们有两个步骤,首先检查初始状态S1是否确实设置,其次我们发送一个事件E1并期望一个状态发生变化,机器最终进入状态S1。
StateMachine<String, String> machine = buildMachine();
StateMachineTestPlan<String, String> plan =
StateMachineTestPlanBuilder.<String, String>builder()
.defaultAwaitTime(2)
.stateMachine(machine)
.step()
.expectStates("SI")
.and()
.step()
.sendEvent("E1")
.expectStateChanged(1)
.expectStates("S1")
.expectVariable("key1")
.expectVariable("key1", "value1")
.expectVariableWith(hasKey("key1"))
.expectVariableWith(hasValue("value1"))
.expectVariableWith(hasEntry("key1", "value1"))
.expectVariableWith(not(hasKey("key2")))
.and()
.build();
plan.test();
这些实用程序也用于框架内以测试分布式状态机功能,并可将多台计算机添加到计划中。 如果添加了多台机器,则还可以选择是将事件发送到特定机器,随机机器还是所有机器。
以上测试例子使用hamcrest导入:
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.collection.IsMapContaining.hasKey;
import static org.hamcrest.collection.IsMapContaining.hasValue;
import static org.hamcrest.collection.IsMapContaining.hasEntry;
预期的所有可能选项都记录在javadocs StateMachineTestPlanStepBuilder中。