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

调试时Mockito抛出InvalidUseOfMatchersException,Mock配置问题排查

Mock配置引发InvalidUseOfMatchersException异常的问题分析与修复

问题场景

单元测试中配置Mock后,仅在调试时抛出以下异常:

Method threw 'org.mockito.exceptions.misusing.InvalidUseOfMatchersException' exception. Cannot evaluate org.service.mediaprocessing.MediaProcessingService$MockitoMock$7570iSIH.toString()

测试类代码:

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class SQSS3EventHandlerTest2 {

    @MockBean
    private MediaProcessingService mediaProcessingService;


    @InjectMocks
    @Autowired
    private SQSS3EventHandler handler;

    @BeforeEach
    void setUp() {
    }

    @AfterEach
    void tearDown() {
    }

    @Test
    void apply() throws IOException, InterruptedException, MetadataExtractionFailureException {
        S3ObjectMetadata s3ObjectMetadata = new S3ObjectMetadata();
        s3ObjectMetadata.setContentType("audio/wav");
        s3ObjectMetadata.setContentLength(9L);
        Map<String, String> bucketDtlMap = Map.of("bucket", "unit-test-bucket", "key", "2023/123456/15.wav");

        MultimediaFileResponse mediaProcessResp = new MultimediaFileResponse();
        S3ObjectTags s3ObjectTags = new S3ObjectTags();
        s3ObjectTags.setBitDepth("16");
        s3ObjectTags.setFormat("Wav");
        s3ObjectTags.setSamplingFrequency("44100");
        s3ObjectTags.setTotalDuration("9");
        s3ObjectTags.setCodec("pcm_s16le");
        mediaProcessResp.setS3ObjectTags(s3ObjectTags);

        when(mediaProcessingService.insertMultimediaMetadata(anyMap())).thenReturn(mediaProcessResp);

        boolean res = handler.updateArtefactAndTags(s3ObjectMetadata, bucketDtlMap, ArtefactInput.classType.SOUND.name());
        System.out.println(res);
    }
}

服务类代码:

@Service
public class MediaProcessingServiceImpl implements MediaProcessingService {


    public MultimediaFileResponse insertMultimediaMetadata(Map<String, String> bucketDtlMap)
                throws MetadataExtractionFailureException {
            MultimediaFileResponse multimediaFileResponse = null;
          // code logic and http call to other servicer. it is removed

            return multimediaFileResponse;
        }

}

问题原因

  1. 注解混用冲突:被测试对象handler同时标注了@InjectMocks和@Autowired。@InjectMocks是Mockito负责注入Mock对象的注解,@Autowired是Spring的依赖注入注解,两者混用会导致注入逻辑冲突,破坏Mock对象的内部状态,调试时调用Mock对象的toString()方法触发了Mockito的匹配器校验,从而抛出异常。
  2. 冗余注解:@SpringBootTest本身已经集成了Mockito的支持,无需额外添加@ExtendWith(MockitoExtension.class),重复注解可能引发上下文加载的潜在冲突。

修复方案

方案一:基于Spring Boot测试环境(保留完整上下文)

修改测试类中handler的注解,移除@InjectMocks,仅保留@Autowired。@MockBean会将Mock版的MediaProcessingService放入Spring上下文,Spring会自动完成依赖注入:

@SpringBootTest
class SQSS3EventHandlerTest2 {

    @MockBean
    private MediaProcessingService mediaProcessingService;

    // 仅保留@Autowired注解
    @Autowired
    private SQSS3EventHandler handler;

    // 其余测试逻辑保持不变
}

方案二:纯Mockito测试(不加载Spring上下文)

如果不需要完整的Spring上下文,可改用纯Mockito测试,移除@SpringBootTest、@MockBean和@Autowired,使用Mockito原生的@Mock和@InjectMocks:

@ExtendWith(MockitoExtension.class)
class SQSS3EventHandlerTest2 {

    @Mock
    private MediaProcessingService mediaProcessingService;

    @InjectMocks
    private SQSS3EventHandler handler;

    // 其余测试逻辑保持不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:54:56