【问题标题】:Why does Drools validate all other rules when using an Agenda Filter to fire a specifc rule?为什么 Drools 在使用议程过滤器触发特定规则时会验证所有其他规则?
【发布时间】:2016-10-20 23:18:47
【问题描述】:

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

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”的过滤器运行测试时,我将收到一个空指针,因为我的地图中没有“其他”的值,即使我正在过滤的规则不关心“其他”

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

【问题讨论】:

    标签: java unit-testing testing drools


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我认为这在任何地方都没有记录,但可以在负责评估整个规则的源类中看到。
    • 记录 Rete 及其改进工作的方式。议程过滤器仅影响规则触发是必然的结果。
    • @Seephor 有没有办法实现这一点。因为它会因为有不同的列而抛出异常。
    • @Neetika 你应该问一个新问题,详细解释你的问题出在哪里。您在这里的评论并没有真正阐明。
    • @laune 谢谢。实际上我遇到了同样的问题......通过在 drl 文件中使用更多条件来解决它。
    【解决方案2】:

    你可以把规则放在不同的包里,然后通过不同的KieSession加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多