Mockito 匹配器比较 Set 中的项目,而不是 Set 引用本身

Fel*_*lix 5 java set matcher mockito

when(validator.isValid(Sets.newHashSet("valid"))).thenReturn(true);
Run Code Online (Sandbox Code Playgroud)

validator.isValid(set)被调用时它返回false。这是因为验证器实现创建了一个与传递的不同的新集合(引用不同)——两个集合中的项目是相同的。

如果集合包含相同的项目,无论集合实例如何,我都需要返回true

类似于org.mockito.Matchers

public static <T> Set<T> anySetOf(Class<T> clazz) {
        return (Set) reportMatcher(Any.ANY).returnSet();
}
Run Code Online (Sandbox Code Playgroud)

除了我不会通过实例之外Class<T>.class

和同样的verify

verify(validator, times(1)).isValid(Sets.newHashSet("valid"));
Run Code Online (Sandbox Code Playgroud)

有这样的匹配器吗?

Fel*_*lix 5

显然 JB Nizet 是对的。不需要特定的匹配器。

我尝试使用我自己的匹配器,然后在删除后它也有效:

public static class SetItemMatcher extends ArgumentMatcher<Set<String>> {
    public static Set<String> setOf(Set<String> items) {
        return argThat(new SetItemMatcher(items));
    }

    private final Set<String> expected;

    public SetItemMatcher(Set<String> expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object argument) {
        Set<?> actual = (Set<?>) argument;
        return actual.size() == expected.size()  && containsAllItems(actual);
    }

    private boolean containsAllItems(Set<?> actual) {
        for (Object o : actual) {
            if (!expected.contains(o)) {
                return false;
            }
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)