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
分成 List
个 String
。
然后使用 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)))
我的 Mockito 版本不是最新版本 1.10.19
我的DAO中有一个方法class我想测试一下,例如
public void updateMe(String commaSeparatedAttributes)
它得到一个字符串作为参数,逗号分隔列表为 2,5,3
问题是无法保证列表的顺序。
我用 Hamcrest containsInAnyOrder
找到了这个
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
分成 List
个 String
。
然后使用 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)))