Springockito 或 Mockito 匹配方法中传递的泛型类



有没有办法区分 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像你在这里那样区分c1c2

其次,永远不要像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语法来表达,该语法无法检查其返回类型。

相关内容

  • 没有找到相关文章

最新更新