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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:29:50