Mockito 间谍对象,使用 any() 作为参数进行验证

use*_*782 4 java unit-testing verify mockito

我有一个简单的单元测试

Map<String, String> spyMap = spy(Map.class); 
spyMap.put("a", "A");
spyMap.put("b", "B");

InOrder inOrder = inOrder(spyMap);

inOrder.verify(spyMap).put(any(), any());
inOrder.verify(spyMap).put(any(), any());
Run Code Online (Sandbox Code Playgroud)

但这会引发错误。以下工作:

inOrder.verify(spyMap).put("a", "A");
inOrder.verify(spyMap).put("b", "B");
Run Code Online (Sandbox Code Playgroud)

所以我只能用精确的字符串匹配来测试?这对我来说似乎是有限的。我的测试方法实际上生成了一个随机字符串,所以我不知道究竟会插入到地图中。我尝试使用ArgumentCaptor方法,但这也不起作用。

Map<String, String> spyMap = spy(Map.class); 
spyMap.put("a", "A");
spyMap.put("b", "B");

ArgumentCaptor<String> arg1 = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<String> arg2 = ArgumentCaptor.forClass(String.class);

verify(spyMap).put(arg1.capture(), arg2.capture());
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 6

这里的问题不是any()匹配器,而是您调用put两次并试图验证单个调用的事实。相反,您应该使用:times VerificationMode

inOrder.verify(spyMap, times(2)).put(any(), any());
// Here ---------------^
Run Code Online (Sandbox Code Playgroud)