package com.jbpm.test;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class RequestHolidayTestCase extends TestCase {
private JbpmConfiguration config = JbpmConfiguration.getInstance();
private JbpmContext ctx = config.createJbpmContext();
// helloworld 对应于 jbpm_processdefinition 表的 name 字段值,也即
// processdefinition.xml 的 name
// 这个值得取比较耗时,实际项目里最好和“数据库的 JDBC 连接”一样,让它共享,不要频繁打开关闭。
private ProcessDefinition processDefinition = ctx.getGraphSession()
.findLatestProcessDefinition("requestholiday");
public void testNewRequest() {
long id = newRequest();
System.out.println("id=" + id);
checkNewRequest(id);
confirmRequest(id);
checkConfirmRequest(id);
ctx.close();// 关闭 jbpm 容器
}
/**
* 创建一个请假单,并将流程向下提交(提交到经理审批)
*
* @return 此时返回的是jbpm_processdefinition表的version_字段(即版本)
*/
private long newRequest() {
// 创建一个新流程
ProcessInstance pi = processDefinition.createProcessInstance();
// 取得流程的数据环境
ContextInstance ci = pi.getContextInstance();
// 创建一张请假单
ci.setVariable("name", "生病请假单");
// 请假天数
ci.setVariable("day", 2);
// 请假原因
ci.setVariable("note", "生病");
// 请假原因,等于上边一行设置的值
// ,但(此时的设置并不会生效,当执行到审批流程时,会执行RequestHolidayAction,将note的值设为"我要请假")
assertEquals("生病", ci.getVariable("note"));
// 请假申请结束,转到下一个流程结点
pi.signal();
return pi.getId();
}
/**
* 根据流程版本的Id
*
* @param id
*/
private void checkNewRequest(long id) {
// 从数据库提取原流程
ProcessInstance pi = ctx.loadProcessInstance(id);
// 取得流程的数据环境
ContextInstance ci = pi.getContextInstance();
// 检测请假单
// 依次检测请假的名字,天数,原因
assertEquals("生病请假单", ci.getVariable("name"));
assertEquals(Integer.valueOf(2), ci.getVariable("day"));
assertEquals("生病", ci.getVariable("note"));
// 当前是结点为 confirm
assertEquals(pi.getRootToken().getNode().getName(), "confirm");
// 流程还没结束
assertFalse(pi.hasEnded());
}
/**
* 根据流程的id,审批请假
*
* @param id
*/
private void confirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// 不通过
ci.setVariable("note", " 不准请假,继续加班 ");
// 审批结束,到下一个流程结点
pi.signal();
}
/**
* 根据流程的Id,检测请假的审批情况
*
* @param id
*/
private void checkConfirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// 这个"准假"是在 ConfirmAction中设置的(ConfirmAction 类在 signal后执行)
assertEquals("准假", ci.getVariable("note"));
// 当前是结点为 end
assertEquals(pi.getRootToken().getNode().getName(), "end");
// 流程结束了
assertTrue(pi.hasEnded());
}
}
评论1
最新资源