为 Spock 交互匹配顺序无关的集合内容

Match order-independent collection contents for Spock interaction

是否可以在列表上进行匹配,而不考虑 Spock 交互的顺序?

比如我有以下方法:

public void execute(List<User> users)
{
  List<User> admins = users.stream().filter(User::isAdmin).collect();
  worker.initAdmins(admins);
}

我想测试 worker.initAdmins 是否被我预期的用户调用,如下所示:

def test()
{
  setup:
    // initialize a list of Users, some admin some not
    Collections.shuffle(users)
  when:
    task.execute(users)
  then:
    1 * worker.initAdmins(expectedAdminList)
}

问题是我的交互不匹配,因为我无法保证传入列表的顺序。这是否可以解决?

我最终找到了可行的解决方案。对于其他任何人,它在未来可能会有所帮助:

1 * worker.initAdmins({[it.containsAll(expectedAdminList)] && it.size() == expectedSize})

或者,您可以在方法调用期望中强制转换为 Set

1 * worker.initAdmins(expectedAdminList as Set)

请注意,这假设您的传入列表中没有重复项是可靠的。