我的Mockito版本不是最新的版本1.10.19
我想在我的DAO类中测试一个方法,例如
public void updateMe(String commaSeparatedAttributes)
它以逗号分隔列表作为参数获取字符串为2,5,3
问题在于无法保证列表的顺序。
我在Hamcrest containsInAnyOrder
找到了这个solution,但这对我没有帮助,因为参数是一个String,我尝试了几个选项(包括发送ArrayList):
verify(dao).updateMe(argThat(Matchers.containsInAnyOrder("2","5,"3")));
这不是编译错误:
Type mismatch: cannot convert from Iterable<capture#1-of ? extends String> to String
修改
以下在测试中返回NullPointerException
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"));
}
}
));
答案 0 :(得分:0)
您的updateMe
方法需要String
。验证中使用的匹配器需要Collection
。你可能最好写一个自定义匹配器。
首先,您需要将逗号分隔String
分成List
String
个。
然后根据您的期望使用List::containsAll
。
verify(dao).updateMe(argThat(t -> {
List<String> inputs = Arrays.asList(t.split(","));
return inputs.containsAll(Arrays.asList("2", "5", "3"));
}));
答案 1 :(得分:0)
我没有找到可行的解决方案,但我决定使用逗号分隔值的字符串容易出错,并将DAO方法签名更改为Set,因此更改了mockito测试以检查Set是否按预期工作:
verify(dao).updateMe(new HashSet<Integer>(Arrays.asList(2,5,3)))