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

