1

我已经为 Camunda 引擎配置了org.camunda.bpm.engine.test.mock.MockExpressionManager. 乍一看,它按预期工作:当我这样做时 Mocks.register("myDelegate", myDelegateMock),bpmn 进程调用我的模拟,而不是真正的委托。但是当有一个任务被某个计时器边界事件调用时,模拟被忽略并且真正的委托被调用。

我查看了代码,发现模拟存储在 ThreadLocal 中。如果任务是由定时器调用的,则执行发生在不同的线程中。这看起来像是这种行为的根本原因。如果任务被标记为异步,可能模拟也将不起作用。

我也尝试过扩展 https://github.com/camunda/camunda-bpm-mockito ,但看起来它在内部使用相同的 Mocks.register,并且对我也不起作用。

可能还有其他一些模拟委托的可能性,适用于计时器的情况?

4

1 回答 1

1

好吧,这已经在您提到的线程中得到了回答:

Mocks.register 旨在用于纯单线程、无作业执行器的“单元测试”环境。在这样的环境下,您需要在自己的测试线程中显式触发定时器作业,而不是设置时间并等待作业执行器处理作业:

Job job = processEngineRule.getManagementService().createJobQuery().singleResult();
processEngineRule.getManagementService().executeJob(job.getId());

然后它应该很高兴地解析名称并且应该可以工作。

所以解决方法是:让进程跑到定时器事件中,然后手动执行job(),让进程继续,就好像到了定时器一样。即使没有单线程问题,这也是一个好主意:不要在 camunda 测试中模拟计时器,只需验证进程是否在正确的步骤中等待并控制计时器条件(到期日期)是否等于您的预期。

于 2015-04-24T18:11:12.243 回答