我已使用org.camunda.bpm.engine.test.mock.MockExpressionManager
配置了Camunda引擎。
乍一看它按预期工作:当我这样做
Mocks.register("myDelegate", myDelegateMock)
,bpmn进程调用我的mock,但不调用真正的委托。
但是当有一个由某个计时器边界事件调用的任务时,模拟被忽略并且真正的委托被调用。
我查看了代码,发现模拟存储在ThreadLocal中。如果任务由计时器调用,则执行发生在不同的线程中。这看起来像是这种行为的根本原因。如果任务被标记为异步,那么模拟也可能无效。
我也试过了扩展程序 https://github.com/camunda/camunda-bpm-mockito 但看起来在内部它使用相同的Mocks.register,对我来说也不起作用。
可能还有其他一些模拟委托的可能性,可以用于计时器的情况吗?
答案 0 :(得分:1)
嗯,这已经在你提到的帖子中得到了解答:
Mocks.register旨在用于纯粹的单线程, 无工作执行者,“单元测试”环境。在这样的环境中, 而不是设置时间并等待作业执行者 处理作业,你需要明确触发你的计时器作业 自己的测试线程:
Job job = processEngineRule.getManagementService().createJobQuery().singleResult(); processEngineRule.getManagementService().executeJob(job.getId());
然后它应该愉快地解析名称并且应该工作。
所以解决方法是:让进程运行到timer事件,然后手动执行job(),这样进程就像计时器到达一样继续。即使没有单线程问题,这也是一个好主意:不要在camunda测试中模拟定时器,只需验证进程是否在正确的步骤中等待并控制定时器条件(到期日期)是否等于您预期的条件。