- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个基于注释的状态机配置:
@Component @Scope(BeanDefinition.SCOPE_PROTOTYPE)
@EnableStateMachine(name = "machine1")
public class Machine1 extends
EnumStateMachineConfigurerAdapter<SimStates, SimEvents> {
@Override
public void configure(StateMachineStateConfigurer<SimStates, SimEvents> states) throws Exception {
states.withStates()
.initial(INIT)
.state(INIT)
.state(S1)
.state(FINISH)
.end(FINISH)
;
}
...
现在我想为它创建测试。我不希望隐式调用 getBean("machine1")
"通过 StateMachineFactory.getStateMachine("machine1")
,这需要应用程序上下文。
我宁愿实例化Machine1
并将其提供给某些构建器、配置器或适配器以获得 StateMachine<>
实例。
public class Machine1Test {
@Test
public void testMachine1() throws Exception {
final StateMachineConfigurer<SimStates, SimEvents> smc =
new Machine1();
final StateMachineBuilder.Builder<SimStates, SimEvents> builder =
StateMachineBuilder.builder();
// can I use the builder together with smc? Or something else?
StateMachine<SimStates,SimEvents> sm = ... // how?
}
}
更新:我将“没有完整的应用程序上下文”更新为“没有对 getBean("machine1")
的隐式调用”。问题还在于了解 Spring 状态机的所有工厂、适配器、配置和配置器。
最佳答案
I'd rather instantiate Machine1 and feed it to some Builder, Configurator or Adapter to get a StateMachine<> instance.
Spring State Mahcine支持基于注释的实例化配置(例如通过 Adapter )或 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();
}
}
Now I want to create Tests for it.
使用 TestPlanBuilder 进行测试:
有开箱即用的测试支持来测试 spring 状态机。它叫做 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>
有关测试的详细官方文档可用here .
I would prefer not have an implicit call to getBean("machine1")" via StateMachineFactory.getStateMachine("machine1"), which would require an application context.
通过 Builder 创建 SM 不需要任何 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);
}
};
}
关于java - 如何从 StateMachineConfigurer 创建 StateMachine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54828460/
我的 Spring 状态机中有一个守卫。 @Bean public Guard myGuard() { return context -> { try {
bbv.Common.StateMachine 类是我见过的最好的状态机代码。但它只缺少一件事:获取当前状态。 这是一个订单跟踪系统: fsm = new ActiveStateMachine();
使用新的 Spring Statemachine 项目,我可以在不使用可用于 JavaConfig 和 Spring @Configuration 类的适配器类的情况下以编程方式创建状态机吗? 最佳答
我正在测试 Spring Statemachine,特别是我对应用状态机来管理对象的状态感兴趣。 我的状态机类型为StateMachine . 我的业务对象,Episode ,具有类型为 state
我正在测试 Spring Statemachine,特别是我对应用状态机来管理对象的状态感兴趣。 我的状态机类型为StateMachine . 我的业务对象,Episode ,具有类型为 state
我使用 Spring 指南编写了状态机的实现。 但我无法对更改状态做出任何反应,尽管状态本身已成功更改。也许我误解了 Beans 类的目标?我需要实现状态变化时自动执行closeDoor()和star
我是 Spring 状态机的新手。 我已经在配置文件中配置了状态和转换,使用它们能够成功编排我的微服务。 现在我计划在外部存储库 (MYSQL DB) 中保存状态和转换 当我尝试使用 JpaState
有人可以举一个简单的例子来说明如何使用pluginaweek state_machine对于具有事件记录的票证模型? 我不明白文档中的复杂示例。 示例说明: 新 -> 接受、拒绝、反馈 接受 -> 已
我将 Spring Statemachine 引入到现有项目中,希望能够合并和澄清我们的业务逻辑。我们有各种具有互连状态的 JPA 实体,我在将持久状态设置为现有状态机的当前状态时遇到了一些麻烦。 我
使用 Spring 状态机,我们有状态和事件。我找不到任何关于是否可以在配置期间将静态数据附加到状态的文档。 例如,如果有状态S1和S2 public void configure(StateMach
使用 Spring 状态机,我们有状态和事件。我找不到任何关于是否可以在配置期间将静态数据附加到状态的文档。 例如,如果有状态S1和S2 public void configure(StateMach
由于我必须支持对状态机的并发访问,因此我无法使用通常的 Autowired 单例方法。相反,我尝试按照文档中的描述构建状态机,此处: http://docs.spring.io/spring-stat
我有一个 Spring 状态机,使用 EnumStateMachineConfigurerAdapter 配置,并用 @EnableStateMachineFactory 注释 一切顺利,我可以使用工
我有一个基于注释的状态机配置: @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) @EnableStateMachine(name = "machin
我尝试在项目中使用 Spring Statemachine 框架,但是在编译时遇到构建 bean 定义错误。 2017-07-25 16:37:25.462:WARN:oejd.DeploymentM
我创建了一个 Spring Cloud 数据流 Stream,以 Gemfire 作为源,以 Log 作为接收器,并使用rabbitMQ 来处理消息。我能够成功地将流部署到我们的一台机器上。但是,当我
我觉得我已经很接近完成这项工作了,但似乎无法完成... 我有一个带有传奇/状态机的 .NET Core ASP 应用程序,它似乎在大多数情况下都运行良好。它: 收到请求 发布一个由传送名单拾取的事件
我正在开发一个 SpriteKit 游戏,使用 GKStateMachine 在多个场景之间进行转换。我正在使用一个包含 StateMachine 实例的类,该实例具有多个状态。状态本身可以通过初始值
我正在尝试让 StateMachine 在状态之间执行一些数据库操作。 所以我有一个“开始”状态,它使用 CallExternalMethodActivity 在用 ExternalDataExcha
我对 C++ 中函数指针的概念还很陌生,所以我不知道如何正确地写下我的问题。请耐心等待。 基本上,我想要做的是创建一个 Button 对象,其构造函数接受一个函数指针作为其参数。该函数指针指向将更改状
我是一名优秀的程序员,十分优秀!