Mockito - 逗号验证参数,逗号分隔列表无顺序

Mockito - comma verify argument with comma separated list without order

我的 Mockito 版本不是最新版本 1.10.19

我的DAO中有一个方法class我想测试一下,例如

public void updateMe(String commaSeparatedAttributes)

它得到一个字符串作为参数,逗号分隔列表为 2,5,3

问题是无法保证列表的顺序。

我用 Hamcrest containsInAnyOrder 找到了这个 ,但这对我没有帮助,因为参数是一个字符串,我尝试了几个选项(包括发送 ArrayList):

verify(dao).updateMe(argThat(Matchers.containsInAnyOrder("2","5,"3")));

这不是编译错误:

Type mismatch: cannot convert from Iterable<capture#1-of ? extends String> to String

编辑

还有下面的return NullPointerException in test

verify(dao).updateMe(argThat( 
new ArgumentMatcher<String>() { 
@Override 
public boolean matches(Object argument) { 
List<String> inputs = Arrays.asList(((String)argument).split(",")); 
return inputs.containsAll(Arrays.asList("2", "5", "3")); 
} 
} 
));

您的 updateMe 方法采用 String。验证中使用的匹配器需要 Collection。您最好编写自定义匹配器。

您首先需要将逗号分隔 String 分成 ListString

然后使用 List::containsAll 并传递您的期望值。

verify(dao).updateMe(argThat(t -> {
    List<String> inputs = Arrays.asList(t.split(","));
    return inputs.containsAll(Arrays.asList("2", "5", "3"));
}));

我没有找到可行的解决方案,但我认为使用逗号分隔值的字符串容易出错,并将 DAO 方法签名更改为 Set,因此更改了 mockito 测试以检查 Set 是否按预期工作:

verify(dao).updateMe(new HashSet<Integer>(Arrays.asList(2,5,3)))