当前位置: 首页 > 知识库问答 >
问题:

如何测试Drools 7.59中的列表长度?

乐正嘉瑞
2023-03-14

我正在测试对象列表的长度。我正在遵循我在Drools的旧版本(7.44和更早版本)中使用的模式,但它似乎不再起作用了。

这是我的规则:

global BookEventResult result;

rule "Person has 3 or more existing checked out books"
when
  BookEvent( type == BookEventType.BORROW )
  Person( $books: checkedOutBooks )
  ArrayList( size >= 3 ) from $books
then
  result.setSuccess(false);
  result.setReason("User has already checked out 3 books");
end

我传递到规则中的Person实例有3项:

class Person {
  List<Book> checkedOutBooks = new ArrayList<>(); // 3 Book instances in here
}

... BookEvent类型为“借用”。我已经通过IDE中的调试会话确认了这两个问题。

但是,该规则不会触发。

我使用的是Drools 7.59.0。Final,特别是drools-Engine-经典依赖项(因为我更喜欢mvel。)也Java17(openjdk)。在7.50.0中观察到相同的行为。最终和7.47.0。最终;不能测试45或46,因为看起来像是JDK不兼容。47似乎在JDK方面也有点不确定。

我还在7.59版本用JDK 11(Eclipse Temurin采用OpenJDKhotspot)重新测试,结果相同。

多年来,我广泛使用了同样的模式;这是我第一次失败。最新版本的drools在这里引入了某种形式的非向后兼容吗?现在我应该如何检查列表长度?

只是为了傻笑,我添加了这两个测试规则,看看是怎么回事:

rule "Test - No check"
when
  Person( $books: checkedOutBooks )
then
  System.out.println("Book size: " + $books.size());
  System.out.println( $books.getClass().getName() );
end

rule "Test - Exactly 3 books"
when
  Person( $books: checkedOutBooks )
  ArrayList( size == 3 ) from $books
then
  System.out.println("Three books exactly");
end

第一条测试规则打印的书籍大小:3和java。util。ArrayList。第二条测试规则根本没有启动。

根据最后一个预感,我添加了以下测试规则:

rule "Test - assign to list"
when
  Person( $books: checkedOutBooks )
  $booklist: ArrayList() from $books
then
  System.out.println("booklist size: " + $booklist.size());
end

规则根本不会触发。我尝试了java.util.Listjava.util.ArrayList

共有2个答案

湛光明
2023-03-14

我在这里创建了一个复制器,您的规则似乎在这两个7.59.0中都正常工作。最终版和7.44.0版。最终版

我的复制品中可能丢失了一些东西,请创建一份针对它的PR,或者相应地将其放入您的回购中。

井通
2023-03-14

我环顾四周,发现了一些带有“size”和“List”的工作用例

rule "Person has 3 or more existing checked out books"
when
  BookEvent( type == BookEventType.BORROW )
  $person: Person( $books: checkedOutBooks, $books.size >= 3 )
  $book1: Book() from $person.checkedOutBooks.get(0)
  $book3: Book(name == 'book3') from $person.checkedOutBooks
  $bookNames: List(size >= 3) from accumulate (Book($name: name) from $books, collectList($name)) 
then
  System.out.println("First book " + $book1);
  System.out.println("Third book " + $book3);
  System.out.println("Book names " + $bookNames);
  System.out.println("Books " + $books);
end

但我认为你的期望是错误的,因为

 类似资料:
  • 在测试camel路由时,我有一个处理的父类: 我有一个子RouteBuilder类,它继承自该类,并使用 我试过这个 但是它返回null,好像它不能得到super.configure()定义的内容?

  • 我有一个返回对象列表的MockMVC测试。我正在尝试检查此特定属性是否设置正确。 然而,除了显式添加之外,我无法用任何方式使它匹配。KeyPair是一个简单的Pair类,有一个键值,非常类似于一个映射的条目。 我尝试了几种选择 is( keyList ) is( keyList.toString() ) 是(Gson.toJson(keylist) is(mapper . writevalueas

  • 问题内容: 获取最长单词长度的更Python方式是什么: 要么: 或者是其他东西? 是字符串列表。我发现我经常需要这样做,并且在用几个不同的样本量进行计时之后,第一种方法似乎始终如一地更快,尽管在票面价值上似乎效率不高(被叫两次的冗余似乎无关紧要,在第二种方法中发生的更多)这种形式的C代码?)。 问题答案: 我认为两者都可以,但是我认为除非速度是最易读的大考虑。 当我看着它们时,我花了更长的时间才

  • 问题内容: 没有迭代如何确定列中列表的长度? 我有一个这样的数据框: 我计算列中列表的长度,并像这样创建新列: 这给了我这个: 有没有更Python的方式来做到这一点? 问题答案: 您也可以将访问器用于某些列表操作。在这个例子中 返回每个列表的长度。请参阅有关的文档。 对于这些操作,香草Python通常更快。熊猫可以处理NaN。时间安排如下:

  • 问题内容: 我有以下清单 我想根据其子列表的长度对列表进行排序。结果应为: 问题答案: 使用和中可用的参数。它指定一个参数的功能,该参数用于从每个列表元素中提取比较键

  • 问题内容: 我的UL清单很长,我需要分解成较小的清单,每个清单包含约20个项目。 我以为我可以使用类似 但事实并非如此。知道如何以最少的CPU使用jQuery吗? 问题答案: 我将使用删除的s 创建文档片段,然后将其重新添加到所需的位置。在这种情况下,我将它们重新附加到主体上: