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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:30:38