当计时器调用委托时,Camunda MockExpressionManager不起作用

时间:2015-04-23 15:52:06

标签: java junit mockito camunda

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

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

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

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

1 个答案:

答案 0 :(得分:1)

嗯,这已经在你提到的帖子中得到了解答:

  

Mocks.register旨在用于纯粹的单线程,   无工作执行者,“单元测试”环境。在这样的环境中,   而不是设置时间并等待作业执行者   处理作业,你需要明确触发你的计时器作业   自己的测试线程:

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

然后它应该愉快地解析名称并且应该工作。

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