为 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)
请注意,这假设您的传入列表中没有重复项是可靠的。
是否可以在列表上进行匹配,而不考虑 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)
请注意,这假设您的传入列表中没有重复项是可靠的。