Mockito如何通过ArgumentMatcher匹配不在指定列表中的参数值
问题解答
Mockito没有内置直接支持「值不在指定列表中」规则的参数匹配器,通过ArgumentMatchers.argThat()自定义匹配规则即可实现需求。
首先你代码里的变量命名和逻辑存在歧义:你定义的notJob列表实际存的是允许删除的job1/job2/job3,注释要求仅允许删除这三个文件、禁止删除其他文件,建议先把变量名改为allowedFileNames,避免后续逻辑写反。
具体实现
argThat方法接收一个返回布尔值的lambda表达式,表达式返回true时代表当前参数匹配打桩规则,直接在第二个参数位置写入自定义匹配逻辑即可:
@SpringBootTest public class HouseServiceTest{ @MockBean JobService jobService; List<String> allowedFileNames = Arrays.asList("job1", "job2", "job3"); @Test public void test1(){ // 非法参数场景:文件名不在允许列表时,抛出异常阻止删除操作 doThrow(new IllegalArgumentException("非法操作,禁止删除指定范围外的文件")) .when(jobService) .job( ArgumentMatchers.anyString(), // 自定义匹配规则:文件名不在允许列表中即匹配成功 ArgumentMatchers.argThat(fileName -> fileName == null || !allowedFileNames.contains(fileName)) ); // 如果你确实需要参数不在列表中时执行doNothing,替换打桩逻辑即可 // doNothing().when(jobService).job( // ArgumentMatchers.anyString(), // ArgumentMatchers.argThat(fileName -> fileName == null || !allowedFileNames.contains(fileName)) // ); } }
复用优化
如果多个测试用例都需要用到「值不在指定列表」的匹配规则,可以把逻辑抽成通用工具方法,避免重复编码:
// 通用不在列表匹配器 public static <T> ArgumentMatcher<T> notIn(List<T> targetList) { return item -> item == null || !targetList.contains(item); } // 调用方式 ArgumentMatchers.argThat(notIn(allowedFileNames))
注意:匹配逻辑里加了
fileName == null的判断是为了兼容入参为null的场景,避免空指针,如果你的业务里第二个参数不可能为null,可以去掉这个判断。
内容的提问来源于stack exchange,提问作者xxestter
相关产品推荐
相关产品推荐

