A类-具有'doSomething'方法,该方法接受对的列表
B类-具有内部调用A类方法的方法。
我正在尝试为Class B编写Junit,在这里我需要验证模拟对Class A的方法是使用Pair类型调用的。
verify(a,times(1)).doSomething(Mockito.anyListOf(Pair.class))
我需要一种指定类似方法的方法
verify(a,times(1)).doSomething(Mockito.anyListOf(Pair<CustomClass1,CustomClass2>.class))
Java不会让一个类具有相同擦除的两个方法;因此,只要调用doSomething(List)
,它将带有List<Pair<CustomClass1,CustomClass2>>
。
因此,您应该只可以使用:
verify(a,times(1)).doSomething(Mockito.anyList());
或者,如果没有doSomething
的其他单参数重载:
verify(a,times(1)).doSomething(Mockito.any());
可以使用
verify(a, times(1)).doSomething(Mockito.argThat(<HERE_COMES_ARGUMENT_MATCHER_INSTANCE>)); // see below
ArgumentMatcher
是嘲笑用来实现自定义验证逻辑的抽象:
private class MyMatcher extends ArgumentMatcher<List<Pair>> {
private final List<Pair> expected;
public PointMatcher(List<Pair> expected) {
this.expected = expected;
}
@Override
public boolean matches(Object obj) {
if (!(obj instanceof List<Pair>)) {
return false;
}
List<Pair>actual = (List<Pair>) obj;
return // implement your custom logic here and return boolean if it matches
}
}
在此特定示例中,我使用了一个匹配器,可以将实际列表与期望的列表进行比较,但是您可以创建一个匹配器,该匹配器确实具有“较弱”的比较标准。
不是真正的问题答案,而是替代方法(可能是一个更好的选择)。我最终使用Argument Captor捕获参数,然后可以声明捕获的值以验证它们是否与期望值匹配。
@Captor
private ArgumentCaptor<List<Pair<CustomClass1, CustomClass2>>> pairListArgCaptor;
//Capture Values
verify(a,times(1)).doSomething(pairListArgCaptor.capture());
assertEquals(expectedCustomObject1,pairListArgCaptor.get().get(0).getFirst());
assertEquals(expectedCustomObject2,pairListArgCaptor.get().get(0).getSecond());