Spring boot camunda 单元测试 - 异步之前/之后

问题描述 投票:0回答:2

我的模型有嵌套调用活动。我使用 spring boot camunda starter 创建了单元测试。测试看起来像

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class DiagramTest {


    @Autowired
    private ProcessEngine processEngine;

    @Rule
    @ClassRule
    public static ProcessEngineRule rule;

    @PostConstruct
    void initRule() {
        rule = TestCoverageProcessEngineRuleBuilder.create(processEngine).build();
    }

    @Before
    public void setup() {
        ProcessEngineTests.init(processEngine);
    }

    @Test
    @Deployment(resources = {"process.bpmn", "subprocess.bpmn", "sub-subprocess.bpmn"})
    @RequiredHistoryLevel(ProcessEngineConfiguration.HISTORY_NONE)
    public void ruleUsageExample() {


        RuntimeService runtimeService = rule.getRuntimeService();
 runtimeService.startProcessInstanceByKey("process"); }

我的问题是,在大多数组件上,我在之前/之后使用异步,因此子进程不会启动。当我删除 async-s 时,它按预期工作。在 camunda bpmn 中测试异步行为的正确方法应该是什么?

spring spring-boot bpmn camunda
2个回答
3
投票

我不太确定这会解决你的问题,但它不适合发表评论。

这里的问题是流程实例被持久化,然后通过线程池中的下一个线程执行,所以你执行单元测试的线程结束了。 您需要通过查询流程引擎来测试作业是否完成并手动执行作业。 我正在使用这个实用方法:

public boolean waitUntilNoActiveJobs(ProcessEngine processEngine, long wait) {
    long timeout = System.currentTimeMillis() + wait;
    while (System.currentTimeMillis() < timeout) {
        long jobCount = processEngine.getManagementService().createJobQuery().active().count();
        if (jobCount == 0) {
            return true;
        }
        final List<Job> jobs = processEngine.getManagementService().createJobQuery().list();
        jobs.forEach(job -> processEngine.getManagementService().executeJob(job.getId()));
        System.out.println("Waiting for " + jobs + " jobs");
    }
    return false;
}

你在测试结束时调用它,参数似乎很明显。


0
投票

此答案用于过程测试。

您可以将 Camunda Assertions

isWaitingAt
execute(job())
一起使用 doc

var processInstance = runtimeService.startProcessInstanceByKey("processKey");

assertThat(processInstance)
  .hasPassedInOrder("start_event","some_other_process")
  .isWaitingAt("sub_process_in_async_before")

execute(job()); 

或从doc

更明确/具体
var processInstance = runtimeService.startProcessInstanceByKey("processKey");

assertThat(processInstance)
  .hasPassedInOrder("start_event","some_other_process")
  .isWaitingAt("sub_process_in_async_before")

execute(job("sub_process_in_async_before", processInstance)); 

注意:您需要禁用作业执行器,否则,现有的作业执行器可能会在您尝试执行作业时锁定作业。

使用以下属性在 SpringBoot 中禁用作业执行器的示例(来自doc

camunda.bpm.job-execution.enabled=false
© www.soinside.com 2019 - 2024. All rights reserved.