Spring 启动 camunda 单元测试 - 异步 before/after
Spring boot camunda unit tests - async before/after
我的模型有嵌套调用活动。我使用 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"); }
我的问题是我在大多数组件上使用异步 before/after,因此子进程无法启动。当我删除 async-s 时,它按预期工作。在 camunda bpmn 中测试异步行为的正确方法应该是什么?
我不确定这是否能解决您的问题,但它不适合发表评论。
这里的问题是进程实例被持久化,然后通过线程池中的下一个线程执行,所以你执行单元测试的线程结束了。
您需要通过查询流程引擎来测试作业是否完成并手动执行作业。
我正在使用这个实用方法:
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;
}
你在测试结束时调用它,参数似乎很明显。
我的模型有嵌套调用活动。我使用 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"); }
我的问题是我在大多数组件上使用异步 before/after,因此子进程无法启动。当我删除 async-s 时,它按预期工作。在 camunda bpmn 中测试异步行为的正确方法应该是什么?
我不确定这是否能解决您的问题,但它不适合发表评论。
这里的问题是进程实例被持久化,然后通过线程池中的下一个线程执行,所以你执行单元测试的线程结束了。 您需要通过查询流程引擎来测试作业是否完成并手动执行作业。 我正在使用这个实用方法:
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;
}
你在测试结束时调用它,参数似乎很明显。