【问题标题】:Camunda MockExpressionManager doesn't work when the delegate invoked by timer当计时器调用委托时,Camunda MockExpressionManager 不起作用
【发布时间】:2015-04-25 02:11:12
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java junit mockito camunda


【解决方案1】:

嗯,这已经在你提到的线程中得到了回答:

Mocks.register 旨在用于纯单线程, no-job-executor,“单元测试”环境。在这样的环境下, 而不是设置时间并等待作业执行者 处理作业,您需要在您的 自己的测试线程:

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

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

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

【讨论】:

  • 是的,这种方法适用于计时器。它更可预测,然后设置一些小值并等待它执行。但是,当为某些服务任务指定“camunda:asyncBefore=true”时,它并不能解决异步任务的问题。这样的任务也将转到单独的线程。顺便说一句,你可以在 github 页面或 javadoc 中提醒这个限制吗?在 camunda-bpm-mockito 页面和 org.camunda.bpm.engine.test.mock.Mocks 文档中找不到有关此类行为的任何信息。
  • 应该以与异步作业相同的方式工作。您只需要确保停用作业执行器。参照docs.camunda.org/latest/guides/user-guide/…
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2014-01-17
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多