Spring项目升级Mockito 5.1+遇XML配置方法匹配错误的技术问询
Mockito 5.1.0+与Spring XML配置的重载方法冲突问题
1. 为何Spring会选择不期望的方法?
Mockito 5.1.0新增了废弃的mock(Object...)重载方法,用于拦截错误调用并抛出异常。Spring匹配工厂方法时,优先选择无需类型转换的实现:
- 预期的
mock(Class<T>)方法需要将XML中的字符串类名转换为Class对象; - 新增的
mock(Object...)可直接接收字符串作为参数(无需转换),被Spring判定为匹配度更高,因此被错误调用,触发参数非法异常。
2. 如何让Spring调用预期的重载方法?
提供三种可行方案:
方案一:明确参数类型
在XML的constructor-arg中添加type属性,强制Spring将字符串转为Class类型,匹配正确方法:
<bean id="apiClient" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="org.example.ApiClient" type="java.lang.Class" /> </bean>
方案二:直接传入Class对象
使用<class>标签传递Class类型参数,避免类型转换歧义:
<bean id="apiClient" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg> <class>org.example.ApiClient</class> </constructor-arg> </bean>
方案三:改用Java配置类
替换XML为Java配置,类型匹配更明确,从根源解决重载匹配问题:
@Configuration public class TestConfig { @Bean public ApiClient apiClient() { return Mockito.mock(ApiClient.class); } }
测试类同步修改配置引用:
@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = TestConfig.class) public class MainTest { @Autowired ApiClient apiClient; @Test public void test() { assertThat(apiClient).isNotNull(); System.out.println(apiClient); } }
内容的提问来源于stack exchange,提问作者hmmnrst
相关产品推荐
相关产品推荐

