Spring JUnit测试报NoSuchMethodError错误求助(Maven+Tomcat7)
嘿,我之前也碰到过一模一样的问题!这个错误本质就是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

