在使用议程过滤器触发特定规则时,为什么Drools会验证所有其他规则?

时间:2016-10-20 23:18:48

标签: java unit-testing testing drools

我有一大堆规则,我正在尝试为它们编写一些单元测试。在我的测试中,我正在使用它:

int rulesFired = kSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule name 1"));

我注意到的事情是,尽管返回的规则数量为1,但Drools仍会尝试验证符合条件的任何其他规则。我有时会从我的规则名称中未定义的其他规则接收错误消息等于议程过滤器,因为条件匹配基于我在kSession中插入的单元测试。

例如我有:

rule "test1"
    when
        $var : Map(this["key"] == "gold")
    then
        do something
    end

rule "test2"
    when
        $var : Map(this["key"] == "gold" && this["other"] == "silver")
    then
        do something
    end

在我对rule1的测试中,我有一张只有“key”的地图。当我使用“test1”的过滤器运行测试时,我将收到一个空指针,因为我的地图中没有“other”的值,即使我过滤的规则不关心“其他”< / p>

为什么会这样?我无法在任何地方找到任何文档。就像Drools在过滤之前必须验证我的DRL文件中的所有规则和语法一样。

1 个答案:

答案 0 :(得分:1)

评估规则条件的代码来自所有规则的组合,可能以减少整体工作量的方式组合相同的条件或条件的一部分(例如模式或约束)。因此,无法在运行时抑制单个规则条件的评估