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