Mockito - 逗号用逗号分隔的列表验证参数而没有顺序

时间:2018-05-27 09:17:11

标签: java unit-testing mockito hamcrest

我的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")); 
} 
} 
));

2 个答案:

答案 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)))