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

Mockito参数匹配器误用问题:全Mock仍报错求助

问题排查:Mockito参数匹配器错误「Invalid use of argument matchers! 0 matchers expected, 4 recorded」

问题描述

我理解Mockito要求方法参数要么全用匹配器,要么全用原始值,但我的测试代码已尝试使用Mock,却仍抛出错误:Invalid use of argument matchers! 0 matchers expected, 4 recorded。以下是测试代码和业务代码:

测试代码

@ExtendWith(MockitoExtension.class)
public class GroupServiceImplTest extends TraceUtilsTest {

    @InjectMocks
    private GroupServiceImpl groupService;

    @InjectMocks
    private ClientRequest clientRequest;

    @Test
    public void shouldThrowHttpExceptionIfDeletionails(){
        Mockito.when(clientRequest.getAPIResponseUsingDeleteMethod(anyString(),
            Mockito.any(Mono.class), Mockito.eq(Request.class),
            Mockito.eq(Response.class))).thenReturn(Mono.error(new HttpServerErrorException(HttpStatus.BAD_REQUEST,
            "Abandoning r")));
        StepVerifier.create(groupService.deleteDataFromUpStream("123",List.of("123")))
            .expectErrorMatches(exception -> exception instanceof HttpClientErrorException && exception.getMessage().contains("Abandoning retrying as Error code is 4xx:"))
            .verify();
    }
}

业务代码

public Mono<GroupDetailsResponse> deleteDataFromUpStream(final String groupName, final List<String> groupData) {
    return deleteGroup(groupName, groupData);
}

private Mono<GroupDetailsResponse> deleteGroup(String groupName, List<String> groupData) {
    return  clientRequest.getAPIResponseUsingDeleteMethod(new StringBuilder("baseurl")
                                                                    .append("prodgroupPath")
                                                                    .append("/")
                                                                    .append(groupName)
                                                                    .toString(),
                                                                    GroupRequest.groupData(groupData).build(),
                                                                    GroupRequest.class,
                                                                    GroupDetailsResponse.class
                                                );
}

问题原因与解决办法

  • ClientRequest未被正确Mock
    你给ClientRequest标注了@InjectMocks,这会让Mockito尝试创建该类的真实实例,而非Mock对象。参数匹配器(如anyString()、any())仅能用于Mock对象的方法调用,对真实对象使用匹配器会直接触发该错误。

  • 参数匹配器与实际调用类型不匹配
    测试代码中第二个参数用了Mockito.any(Mono.class),但业务代码传入的是GroupRequest实例,类型不匹配会导致匹配失败,同时加重参数匹配器的使用错误。

修正后的测试代码

@ExtendWith(MockitoExtension.class)
public class GroupServiceImplTest extends TraceUtilsTest {

    @InjectMocks
    private GroupServiceImpl groupService;

    // 将@InjectMocks改为@Mock,创建ClientRequest的Mock实例
    @Mock
    private ClientRequest clientRequest;

    @Test
    public void shouldThrowHttpExceptionIfDeletionFails(){
        // 修正第二个参数的匹配器,与业务代码传入的GroupRequest类型对应
        Mockito.when(clientRequest.getAPIResponseUsingDeleteMethod(anyString(),
            Mockito.any(GroupRequest.class), Mockito.eq(GroupRequest.class),
            Mockito.eq(GroupDetailsResponse.class))).thenReturn(Mono.error(new HttpServerErrorException(HttpStatus.BAD_REQUEST,
            "Abandoning r")));
        StepVerifier.create(groupService.deleteDataFromUpStream("123",List.of("123")))
            .expectErrorMatches(exception -> exception instanceof HttpClientErrorException && exception.getMessage().contains("Abandoning retrying as Error code is 4xx:"))
            .verify();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:20:52