jbpm5.1介绍(9)
Junit测试调用子流程
下面的示例中测试在程序中调用其它程序的子流程的示例,需要加载两个配置文件
和
需要指定属性
下面是调用的示例程序
public void testCallActivity() throws Exception { System.out.println("Loading process BPMN2-CallActivity.bpmn2"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); kbuilder.add(ResourceFactory .newClassPathResource("junit/BPMN2-CallActivity.bpmn2"), ResourceType.BPMN2); kbuilder.add( ResourceFactory .newClassPathResource("junit/BPMN2-CallActivitySubProcess.bpmn2"), ResourceType.BPMN2); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); Map< String , Object> params = new HashMap< String , Object>(); params.put("x", "oldValue"); ProcessInstance processInstance = ksession.startProcess( "ParentProcess", params); assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED); assertEquals("new value", ((WorkflowProcessInstance) processInstance).getVariable("y")); } |
程序输出以下结果
Loading process BPMN2-CallActivity.bpmn2
我是子流程 subX=oldValue
证明子流程调用成功
Junit测试子流程执行过程中触发的事件
下面的示例中测试在子流程执行的过程中触发各种事件
流程如下图
在执行到hello1的时候变量x是没有值的,在执行hello2的时候赋值,在执行到hello3的时候变量能够输出值
测试程序如下:
public void testSubProcess() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-SubProcess.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.addEventListener(new DefaultProcessEventListener() { public void afterProcessStarted(ProcessStartedEvent event) { System.out.println("流程启动以后"+event); } public void beforeVariableChanged(ProcessVariableChangedEvent event) { System.out.println("变量改变之前"+event); } public void afterVariableChanged(ProcessVariableChangedEvent event) { System.out.println("变量改变以后"+event); } }); ProcessInstance processInstance = ksession.startProcess("SubProcess"); assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED); } |
输出的结果如下:
Loading process BPMN2-SubProcess.bpmn2
x = null
变量改变之前==>[ProcessVariableChanged(id=2:x; instanceId=1:x; oldValue=null; newValue=Hello; processName=Minimal SubProcess; processId=SubProcess)]
变量改变以后==>[ProcessVariableChanged(id=2:x; instanceId=1:x; oldValue=null; newValue=Hello; processName=Minimal SubProcess; processId=SubProcess)]
x = Hello
Goodbye World
流程启动以后==>[ProcessStarted(name=Minimal SubProcess; id=SubProcess)]
Junit测试多流程循环
下面的示例中主要测试的是多流程循环的示例
界面流程如下
执行的测试程序如下:
public void testMultiInstanceLoopCharacteristicsProcess() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-MultiInstanceLoopCharacteristicsProcess.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); Map< String , Object> params = new HashMap< String , Object>(); List< String > myList = new ArrayList< String >(); myList.add("First Item"); myList.add("Second Item"); params.put("list", myList); ProcessInstance processInstance = ksession.startProcess( "MultiInstanceLoopCharacteristicsProcess", params); assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED); } |
执行结果如下
Loading process BPMN2-MultiInstanceLoopCharacteristicsProcess.bpmn2
item = First Item
item = Second Item
Goodbye World
Junit测试异常事件处理流程
下面的示例中主要测试的是在执行到子流程中的异常的时候的处理流程
程序流程如下:
首先执行子流程中的内容,默认遇到错误,将触发错误事件,然后执行对应的事件,输出内容
测试程序如下:
public void testEscalationBoundaryEvent() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-EscalationBoundaryEvent.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ProcessInstance processInstance = ksession .startProcess("EscalationBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED); } |
执行完结果如下所示:
Loading process BPMN2-EscalationBoundaryEvent.bpmn2
执行错误流程,触发事件 Escalation handled
Junit测试异常事件处理流程2
下面的示例中主要测试异常处理,同上例基本相同都是执行到错误结点的时候自动触发事件,但是加了一个选择分支
程序流程示例如图
测试程序如下所示
public void testEscalationBoundaryEventInterrupting() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-EscalationBoundaryEventInterrupting.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession .startProcess("EscalationBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_COMPLETED); // TODO: check for cancellation of task } |
执行结果如下:
Loading process BPMN2-EscalationBoundaryEventInterrupting.bpmn2
Escalation handled
Junit测试定时器边界事件
下面的示例中主要测试定时器边界事件
程序流程如下所示:
在属性中设置超时时间是500ms,那么在下面的程序中设置让程序暂停一下执行,触发超时事件
public void testTimerBoundaryEventDuration() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventDuration.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession .startProcess("TimerBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE); Thread.sleep(1000); ksession = restoreSession(ksession, true); assertProcessInstanceCompleted(processInstance.getId(), ksession); } |
设置为1000,那么就将执行错误处理事件
执行的结果如下
Loading process BPMN2-TimerBoundaryEventDuration.bpmn2
Timer handled
Junit测试定时器超时处理
下面的两个示例和上面基本上没有区别,只是强调了一下超时处理的周期和边界事件
直接看示例程序吧
public void testTimerBoundaryEventCycle1() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventCycle1.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession .startProcess("TimerBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE); Thread.sleep(1000); ksession = restoreSession(ksession, true); assertProcessInstanceCompleted(processInstance.getId(), ksession); } public void testTimerBoundaryEventCycle2() throws Exception { KnowledgeBase kbase = createKnowledgeBase("BPMN2-TimerBoundaryEventCycle2.bpmn2"); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession .startProcess("TimerBoundaryEvent"); assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE); Thread.sleep(1000); assertProcessInstanceActive(processInstance.getId(), ksession); Thread.sleep(1000); assertProcessInstanceActive(processInstance.getId(), ksession); ksession.abortProcessInstance(processInstance.getId()); Thread.sleep(1000); } |
分别的执行结果如下:
1)同上示例基本相同
Loading process BPMN2-TimerBoundaryEventCycle1.bpmn2
Timer handled
2)执行两次超时事件
Loading process BPMN2-TimerBoundaryEventCycle2.bpmn2
Timer handled
Timer handled
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架