You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精确测试Drools‘temperature activated’规则触发次数并模拟时间?

解决方案

一、精确统计规则触发次数

有三种可靠方式实现:

  • 自定义议程监听器:实现AgendaEventListener接口,重写afterMatchFired方法,在方法内判断触发的规则名称是否为"temperature activated",每匹配一次就累加计数器。测试结束后直接读取计数器数值,对比是否等于预期的x次。
  • 全局计数器埋点:在规则的then块中引入全局计数器(比如用AtomicInteger作为全局对象插入KieSession),每次触发规则时调用triggerCount.incrementAndGet()。测试时直接获取该全局变量的数值即可。
  • 结合测试框架断言:用JUnit等框架编写测试用例,初始化KieSession并插入测试数据,执行规则后通过监听器或全局计数器拿到触发次数,用assertEquals(x, 触发次数)做断言验证。

二、时间模拟方案

完全可行,Drools内置伪时钟机制支持时间模拟,步骤如下:

  • 获取伪时钟:从KieSession中获取SessionPseudoClock,代替真实时间推进:
    SessionPseudoClock clock = ksession.getSessionClock();
    
  • 设置事件时间:插入SensorMessage时,将其timestamp设为伪时钟的当前时间,或自定义时间点:
    SensorMessage msg = new SensorMessage();
    msg.setTimestamp(clock.getCurrentTime());
    ksession.insert(msg);
    
  • 推进时间并触发规则:调用clock.advanceTime()模拟时间流逝,之后调用ksession.fireAllRules()让规则引擎处理时间窗口、事件过期等逻辑:
    // 模拟前进10秒
    clock.advanceTime(10, TimeUnit.SECONDS);
    ksession.fireAllRules();
    
  • 注意事项:每次推进时间后必须触发规则,否则时间相关的规则逻辑(比如窗口过期、事件失效)不会被执行。

内容的提问来源于stack exchange,提问作者GSerum_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:35:49