Unit testing 单元测试

业务流程是软件项目的一部分,它也应该和普通的业务流程一样进行测试: 使用单元测试。因为 Activiti 是一个嵌入式的 java 引擎,为业务流程编写单元测试和写普通单元测试完全一样。

Activiti 支持 JUnit 3和4进行单元测试。使用 JUnit 3时, 必须集成 org.activiti.engine.test.ActivitiTestCase。它通过保护的成员变量提供 ProcessEngine 和服务,在测试的 setup() 中, 默认会使用classpath 下的 activiti.cfg.xml 初始化流程引擎。 想使用不同的配置文件,可以重写 getConfigurationResource() 方法。 如果配置文件相同的话,对应的流程引擎会被静态缓存, 就可以用于多个单元测试。

继承了 ActivitiTestCase,你可以在测试方法上使用 org.activiti.engine.test.Deployment 注解。测试执行前,与测试类在同一个包下的, 格式为 testClassName.testMethod.bpmn20.xml的资源文件,会被部署。 测试结束后,发布包也会被删除,包括所有相关的流程实例,任务,等等。Deployment 注解也可以直接设置资源的位置。 参考Javadocs
获得更多信息。

把这些放在一起,JUnit 3 测试看起来像这样。

  1. public class MyBusinessProcessTest extends ActivitiTestCase {
  2. @Deployment
  3. public void testSimpleProcess() {
  4. runtimeService.startProcessInstanceByKey("simpleProcess");
  5. Task task = taskService.createTaskQuery().singleResult();
  6. assertEquals("My Task", task.getName());
  7. taskService.complete(task.getId());
  8. assertEquals(0, runtimeService.createProcessInstanceQuery().count());
  9. }
  10. }

要想在使用 JUnit 4 编写单元测试时获得同样的功能, 可以使
用 org.activiti.engine.test.ActivitiRule。 通过它,可以通过getter 方法获得流程引擎和各种服务。 和 ActivitiTestCase 一样(参考上面章节),使用这个 Rule 也会启用org.activiti.engine.test.Deployment 注解(参考上面章节使用和配置的介绍),它会在 classpath 下查找默认的配置文件。 如果配置文件相同的话,对应的流程引擎会被静态缓存, 就可以用于多个单元测试。

下面的代码演示了 JUnit 4 单元测试并使用了 ActivitiRule 的例子。

  1. public class MyBusinessProcessTest {
  2. @Rule
  3. public ActivitiRule activitiRule = new ActivitiRule();
  4. @Test
  5. @Deployment
  6. public void ruleUsageExample() {
  7. RuntimeService runtimeService = activitiRule.getRuntimeService();
  8. runtimeService.startProcessInstanceByKey("ruleUsage");
  9. TaskService taskService = activitiRule.getTaskService();
  10. Task task = taskService.createTaskQuery().singleResult();
  11. assertEquals("My Task", task.getName());
  12. taskService.complete(task.getId());
  13. assertEquals(0, runtimeService.createProcessInstanceQuery().count());
  14. }
  15. }