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中。

results matching ""

    No results matching ""