调试时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; } }
问题原因
- 注解混用冲突:被测试对象
handler同时标注了@InjectMocks和@Autowired。@InjectMocks是Mockito负责注入Mock对象的注解,@Autowired是Spring的依赖注入注解,两者混用会导致注入逻辑冲突,破坏Mock对象的内部状态,调试时调用Mock对象的toString()方法触发了Mockito的匹配器校验,从而抛出异常。 - 冗余注解:
@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
相关产品推荐
相关产品推荐

