我想确保使用特定的字符串集作为参数调用mocked。 例如,我有以下代码:
public class SomeLogic {
@Autowired
private SpecificService specificService;
public void action() {
Set<String> args = fillArgsMethod();
specificService.handleArgs(args);
}
}
我目前尝试测试它是以下
@Mock
private SpecificService specificService
@InjectMocks
private SomeLogic someLogic;
@Test
public void testAction() {
someLogic.action();
verify(specificService).handleArgs(anySet());
}
但我想确定,handleArgs()将收到我期望的确切字符串集。如何修改验证以检查是否使用set“first”,“second”调用handleArgs? 感谢
答案 0 :(得分:11)
Isah给出了一个有效的答案,但我想把你的注意力转向Mockito的更一般的特征ArgumentCaptor
在你的情况下,你会做以下几行:
Class<HashSet<String>> setClass = (Class<HashSet<String>>)(Class)HashSet.class;
ArgumentCaptor<Set<String>> setCaptor= ArgumentCaptor.forClass(setClass .class);
verify(specificService).create(setCaptor.capture());
HashSet<String> capturedSet = setCaptor.getValue();
//do whatever test you want with capturedSet
答案 1 :(得分:8)
在调用测试方法之前准备好Set
参数
@Test
public void testAction() {
Set<String> expectedParams = new HashSet(Arrays.asList("first", "second");
//call tested method
verify(specificService).handleArgs(expectedParams);
}
答案 2 :(得分:8)
isah的解决方案非常适合您,如果您想确认该集合包含您指定的两个项目; Mockito默认使用.equals
进行比较,Set.equals
被定义为以任何顺序引用相等的元素。
对于与您的问题标题匹配的更灵活的“包含”测试,允许超出预期值的集合成员,您还可以使用the Hamcrest contains
matcher:
someLogic.action();
verify(specificService).handleArgs(argThat(contains("first", "second")));
至少,这就是应该的样子。不幸的是,argThat
从Matcher中推断出它的返回类型,它从参数中推断出它的返回类型,因此Java假设你的第一个参数不是Set<String>
而是Iterable<capture#1-of ? extends String>
。您需要明确强制转换并禁止警告才能使其正常工作:
// requires @SuppressWarnings("unchecked")
verify(specificService).handleArgs(
(Set<String>) argThat(contains("first", "second")));