在activiti中模拟一个Call Activity子进程

时间:2014-05-20 10:03:47

标签: jbpm activiti

我正在为activiti(1.13)工作流程编写一组单元测试。我们使用Call Activity子流程来处理在不同工作流之间重复使用的一组操作,但我真的希望能够模拟整个子流程而无需实际执行单个工作流程子流程的任务。

这可能吗?我还没有找到任何相关的文档(但是!)但这并不意味着函数不存在。

3 个答案:

答案 0 :(得分:0)

我使用CallActivity#setProcessDefinitonKey方法在运行时重新定义将调用哪个进程。

想法是在运行时替换被调用进程的名称。 然后你就可以提供一个“哑巴”。什么都不做的过程,或者你可以定义一些更精细的过程来做某事(比如返回一个值,或者调用一些java代码)

伪代码算法是这样的:

redefine(process, target, replacement) {
  ProcessDefinitionEntity processDefinition = getProcessDefinition(process)
  foreach ActivityImpl activity in processDefinition.getActivities() {
    if(activity instanceceof CallActivityBehavior and activity.name == target) {
      activity.setProcessDefinitonKey(replacement)    
    }
  }  
}

您还需要定义getProcessDefinition方法:

ProcessDefinitionImpl processDefinition = Context
      .getProcessEngineConfiguration()
      .getDeploymentManager()
      .findDeployedLatestProcessDefinitionByKey(inProcess);

    return processDefinition.getProcessDefinition()

答案 1 :(得分:0)

您可以在Mockito.spy()和模拟方法org.drools.KnowledgeBase

中间谍(org.drools.runtime.StatefulKnowledgeSessionorg.drools.KnowledgeBase#getProcess()

它看起来像那样:

KnowledgeBase knowledgeBase = createKnowledgeBase();
kbase = spy(knowledgeBase);
ksession = kbase.newStatefulKnowledgeSession();
Whitebox.setInternalState(ksession,"kbase",kbase);
doReturn(kbase.getProcess("processToMockWith")).when(kbase).getProcess(eq("processToMock"));

答案 2 :(得分:-1)

在您的部署声明中,替换一个简化的" mock"模型

@Deployment(resources = {" PathToModelUnderTest"," PathToSimplifiedCallActivityModel"})

只要简化的CallActivity模型具有CallActivity所期望的名称,就可以了