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
相关产品推荐
相关产品推荐

