有没有办法区分 mockito 中的泛型类以进行映射?
方法调用如下所示(除了与返回 true 不同的逻辑。
userWrapper.wrapCall( new Client<Boolean, User>(){
@override
public Boolean run(){
return true
}
}
例如
Client<Boolean, User> c1 = Mockito.any();
Client<Account, User> c2 = Mockito.any();
when (userWrapper.wrapCall( c1 )).thenReturn( true );
when (userWrapper.wrapCall( c2 )).thenReturn( new Account() );
然而,这失败了,因为它似乎只是映射可调用客户端,而不是考虑泛型。我尝试使用 returnAnswer,但是,.getArgs 只返回用户包装器,而不是传递给该方法的 c1/c2。
首先,请记住泛型通过擦除起作用。这意味着几乎没有任何东西可以让Mockito像你在这里那样区分c1
和c2
。
其次,永远不要像any
变量那样提取 Mockito 匹配器。Mockito匹配器通过副作用工作,因此像上面这样的调用可能会以奇怪的方式中断。但是,提取静态方法以保持调用顺序正确应该可以正常工作。
您的两个最佳选择是根据其内容将一张地图与另一张地图区分开来,例如使用 Hamcrest 地图匹配器:
// Will likely need casts or explicit method type arguments.
when(userWrapper.wrapCall(argThat(hasKey(isInstanceOf(Boolean.class)))))
.thenReturn(true);
when(userWrapper.wrapCall(argThat(hasKey(isInstanceOf(Account.class)))))
.thenReturn(new Account());
。或者检查调用顺序,这可能会导致测试变脆:
// May also need generics specified, subject to your Client class definition.
when(userWrapper.wrapCall(Matchers.any()))
.thenReturn(true).thenReturn(new Account());
后者可能更好地使用doReturn
语法来表达,该语法无法检查其返回类型。