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

Spring JUnit测试报NoSuchMethodError错误求助(Maven+Tomcat7)

搞定Spring JUnit测试里的NoSuchMethodError异常

嘿,我之前也碰到过一模一样的问题!这个错误本质就是Spring组件版本不兼容搞出来的,咱们一步步来解决它:

问题根源

你看到的java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.getAnnotationAttributes,说白了就是你的spring-test(4.1.6.RELEASE)和项目里其他Spring核心包(比如spring-core、spring-context这些)版本对不上:

  • 要么是spring-core版本太低,根本没这个方法;
  • 要么是版本太高,方法签名变了,spring-test认不出来。

而且从你贴的pom.xml片段来看,你只写了spring-test的依赖,其他Spring核心包都是通过mybatis-spring这类依赖间接引入的,这些间接引入的版本大概率和你指定的spring-test版本不一致,这就冲突了。

解决步骤

1. 统一所有Spring组件的版本

最稳妥的办法就是在pom.xml里把所有Spring核心依赖都显式写出来,确保版本和spring-test完全一致。比如继续用4.1.6.RELEASE的话,就这么加:

<dependencies>
    <!-- 显式声明Spring核心包,统一版本 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>
    
    <!-- 你的spring-test依赖保持不变 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.1.6.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
    <!-- 其他原有依赖保留 -->
</dependencies>

2. 揪出隐藏的依赖冲突

要是不确定哪里有版本冲突,就用Maven命令打出来依赖树看看:

mvn dependency:tree

在输出里搜org.springframework,看看有没有不同版本的包被偷偷引入。比如如果mybatis-spring带进来了别的Spring版本,就把它排除掉:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 升级到更稳定的版本组合(可选)

如果项目允许的话,直接升级到兼容性更好的版本组合会更省心:

  • 比如Spring 4.3.x系列,和你用的mybatis-spring 1.3.1完全兼容;
  • 要是想更现代一点,升级到Spring 5.x(注意得用JDK 8+,同时mybatis-spring要升到2.0以上)

举个升级到Spring 4.3.29.RELEASE的例子,还能用属性统一管理版本,更方便:

<properties>
    <spring.version>4.3.29.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- 其他依赖按需求调整 -->
</dependencies>

最后检查一下

对了,你用的JUnit 4.12和Spring 4.x是完全兼容的,这部分不用改。

改完之后跑个mvn clean test重新执行测试,应该就能正常跑起来啦!

内容的提问来源于stack exchange,提问作者Jame Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:07:44