Flowable源码注释(十四)事件调度器测试类(下)

该博客主要测试了Flowable事件调度器的功能,包括基础实体事件监听器、异常处理和事件类型的转换。通过创建不同类型的事件并调度它们,验证了监听器的正确响应,并在监听器中引发异常时测试了调度行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flowable源码地址:https://github.com/flowable/flowable-engine

包路径:org.flowable.engine.test.api.event

FlowableEventDispatcherTest Flowable事件调度器测试类

public class FlowableEventDispatcherTest extends PluggableFlowableTestCase {
    
    ...
    
	/**
     * 测试Flowable附带的基础实体事件监听器{@link BaseEntityEventListener}。
     */
    @Test
    public void testBaseEntityEventListener() throws Exception {
        TestBaseEntityEventListener listener = new TestBaseEntityEventListener();

        dispatcher.addEventListener(listener);

        TaskServiceConfiguration taskServiceConfiguration = (TaskServiceConfiguration) processEngineConfiguration.getServiceConfigurations()
                .get(EngineConfigurationConstants.KEY_TASK_SERVICE_CONFIG);
        FlowableEntityEventImpl createEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
                FlowableEngineEventType.ENTITY_CREATED);
        FlowableEntityEventImpl deleteEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
                FlowableEngineEventType.ENTITY_DELETED);
        FlowableEntityEventImpl updateEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
                FlowableEngineEventType.ENTITY_UPDATED);
        FlowableEntityEventImpl otherEvent = new FlowableEntityEventImpl(taskServiceConfiguration.getTaskEntityManager().create(),
                FlowableEngineEventType.CUSTOM);

        // 调度创建事件
        dispatcher.dispatchEvent(createEvent, processEngineConfiguration.getEngineCfgKey());
        assertThat(listener.isCreateReceived()).isTrue();
        assertThat(listener.isUpdateReceived()).isFalse();
        assertThat(listener.isCustomReceived()).isFalse();
        assertThat(listener.isInitializeReceived()).isFalse();
        assertThat(listener.isDeleteReceived()).isFalse();
        listener.reset();

        // 调度更新事件
        dispatcher.dispatchEvent(updateEvent, processEngineConfiguration.getEngineCfgKey());
        assertThat(listener.isUpdateReceived()).isTrue();
        assertThat(listener.isCreateReceived()).isFalse();
        assertThat(listener.isCustomReceived()).isFalse();
        assertThat(listener.isDeleteReceived()).isFalse();
        listener.reset();

        // 调度删除事件
        dispatcher.dispatchEvent(deleteEvent, processEngineConfiguration.getEngineCfgKey());
        assertThat(listener.isDeleteReceived()).isTrue();
        assertThat(listener.isCreateReceived()).isFalse();
        assertThat(listener.isCustomReceived()).isFalse();
        assertThat(listener.isUpdateReceived()).isFalse();
        listener.reset();

        // 调度其他事件
        dispatcher.dispatchEvent(otherEvent, processEngineConfiguration.getEngineCfgKey());
        assertThat(listener.isCustomReceived()).isTrue();
        assertThat(listener.isCreateReceived()).isFalse();
        assertThat(listener.isUpdateReceived()).isFalse();
        assertThat(listener.isDeleteReceived()).isFalse();
        listener.reset();

        // 测试类型实体监听器
        listener = new TestBaseEntityEventListener(org.flowable.task.api.Task.class);

        // 应收到任务的调度事件
        dispatcher.addEventListener(listener);
        dispatcher.dispatchEvent(createEvent, processEngineConfiguration.getEngineCfgKey());

        assertThat(listener.isCreateReceived()).isTrue();
        listener.reset();

        // 不应接收执行的调度事件
        FlowableEntityEventImpl createEventForExecution = new FlowableEntityEventImpl(new ExecutionEntityImpl(), FlowableEngineEventType.ENTITY_CREATED);

        dispatcher.dispatchEvent(createEventForExecution, processEngineConfiguration.getEngineCfgKey());
        assertThat(listener.isCreateReceived()).isFalse();
    }

    /**
     * 在监听器中发生异常时测试调度行为
     */
    @Test
    public void testExceptionInListener() throws Exception {
        // 创建不强制分派失败的侦听器
        TestExceptionFlowableEventListener listener = new TestExceptionFlowableEventListener(false);
        TestFlowableEventListener secondListener = new TestFlowableEventListener();

        dispatcher.addEventListener(listener);
        dispatcher.addEventListener(secondListener);

        FlowableEngineEventImpl event = new FlowableProcessEventImpl(FlowableEngineEventType.ENTITY_CREATED);
        assertThatCode(() -> {
            dispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
        }).doesNotThrowAnyException();
        assertThat(secondListener.getEventsReceived()).hasSize(1);

        // 删除监听器
        dispatcher.removeEventListener(listener);
        dispatcher.removeEventListener(secondListener);

        // 创建强制分派失败的监听器
        listener = new TestExceptionFlowableEventListener(true);
        secondListener = new TestFlowableEventListener();
        dispatcher.addEventListener(listener);
        dispatcher.addEventListener(secondListener);

        assertThatThrownBy(() -> dispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey()))
                .isExactlyInstanceOf(RuntimeException.class)
                .hasMessage("Test exception");

        // 不应该调用第二个侦听器
        assertThat(secondListener.getEventsReceived()).isEmpty();
    }

    /**
     * 测试Flowable引擎事件类型{ @link FlowableEngineeEventType }列表中字符串值(和列表)的转换,用于流程引擎的配置
     * {@link ProcessEngineConfigurationImpl#setTypedEventListeners(java.util.Map)}。
     */
    @Test
    public void testActivitiEventTypeParsing() throws Exception {
        // 使用空null进行检查
        FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(null);
        assertThat(types).isEmpty();

        // 用空字符串检查
        types = FlowableEngineEventType.getTypesFromString("");
        assertThat(types).isEmpty();

        // 单个值
        types = FlowableEngineEventType.getTypesFromString("ENTITY_CREATED");
        assertThat(types).hasSize(1);
        assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);

        // 多个值
        types = FlowableEngineEventType.getTypesFromString("ENTITY_CREATED,ENTITY_DELETED");
        assertThat(types).hasSize(2);
        assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);
        assertThat(types[1]).isEqualTo(FlowableEngineEventType.ENTITY_DELETED);

        // 应忽略分隔符
        types = FlowableEngineEventType.getTypesFromString(",ENTITY_CREATED,,ENTITY_DELETED,,,");
        assertThat(types).hasSize(2);
        assertThat(types[0]).isEqualTo(FlowableEngineEventType.ENTITY_CREATED);
        assertThat(types[1]).isEqualTo(FlowableEngineEventType.ENTITY_DELETED);

        // 无效的类型名
        assertThatThrownBy(() -> FlowableEngineEventType.getTypesFromString("WHOOPS,ENTITY_DELETED"))
                .isExactlyInstanceOf(FlowableIllegalArgumentException.class)
                .hasMessage("Invalid event-type: WHOOPS");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值