You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito单元测试:何时使用参数匹配器或直接传参?

Mockito参数匹配器与直接传参的场景区分

下面针对你列出的几种Mockito写法,逐一说明适用场景:

1. 直接传递具体参数

Mockito.when(function(arg1, arg2)).thenReturn(result)
Mockito.when(function(arg1, arg2)).thenThrow(exception)
  • 适用场景:当你明确知道被测代码会以完全固定的具体参数调用目标方法,且只需要针对这组特定参数的调用设置返回值或抛出异常时使用。
  • 本质上,Mockito会通过equals()方法判断传入参数是否与arg1/arg2匹配,和eq(arg1)的逻辑一致,但写法更简洁。

2. 使用eq()参数匹配器

Mockito.when(function(eq(arg1), eq(arg2))).thenReturn(result)
Mockito.when(function(eq(arg1), eq(arg2))).thenThrow(exception)
  • 核心适用场景:当你需要在同一个存根/验证调用中混合使用精确匹配和通配匹配器时。Mockito强制要求:同一个when或verify调用里,所有参数要么全用具体值,要么全用匹配器。比如你要匹配第一个参数为任意字符串、第二个参数为固定值arg2,就必须写成when(function(anyString(), eq(arg2))),不能直接写when(function(anyString(), arg2))(会触发参数匹配器使用异常)。
  • 次要场景:为了代码可读性,主动用eq()明确标注“此处是精确匹配”,尤其是针对复杂对象时,能清晰传达你的匹配意图。

3. 使用anyString()通配匹配器

Mockito.when(function(anyString(), anyString())).thenReturn(result)
Mockito.when(function(anyString(), anyString())).thenThrow(exception)
  • 适用场景:当你不关心传入的具体字符串内容,只要参数是String类型(不包含null,如需匹配null请用isNull()),就希望触发设定的返回值或异常时使用。
  • 典型场景:测试方法的逻辑不依赖目标方法的参数值,只需要确保方法被调用时能返回固定结果,或者验证方法被调用过即可。

额外注意事项

  • 所有参数匹配器(如eq()、anyString()、any()等)只能用于when存根或verify验证的参数位置,不能在其他地方使用。
  • 若要匹配null值,需使用isNull(),anyString()等类型匹配器不会匹配null。

内容的提问来源于stack exchange,提问作者MusicalChicken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:54:20