我遇到的bug_使用spring+junit4时_java.lang.ExceptionInInitializerError

本文记录了一次使用Spring结合Junit4进行单元测试时遇到的版本冲突问题及解决过程。通过阅读错误日志,作者发现所使用的Spring版本需要Junit4.9以上版本才能正常工作,最终通过更新Junit版本解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细错误日志:

java.lang.ExceptionInInitializerError

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.IllegalStateException: Failed to find class [org.junit.runners.model.MultipleFailureException]: SpringJUnit4ClassRunner requires JUnit 4.9 or higher.
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:102)
... 17 more

具体描述:

由于第一次用spring+Junit4进行单元测试,对他们了解不够深入,出现这个bug时真的是手忙脚乱的,各种百度,各种尝试就是解决不了,网上好多方法都试了就是不行,现在想来不是网上的解决方法不行,而是我遇到的问题和他们不一样啊。网上说java.lang.ExceptionInInitializerError错误是在加载静态代码块时产生的等等等,但是在这个阶段真的有任何可能发生的错误。身为菜鸟的我根本无法一步步分析啊。

问题解决:

捣鼓了近5个小时,快要崩溃的时候,一个偶然的机会看到了错误日志的最后一行,突然明白了,原来是版本的问题,我用的是spring4.2.4.RELEASE和junit4.8,显然springtest需要最少Junit4.9,马上动手更换了Junit4.9,瞬间所有问题都没了。

感想收获:

1.建项目导包时一定要考虑版本兼容的问题,在这之前我遇到好几个因为版本出现的问题,自己选择框架版本时要多了解一些知识,不能随性而为,更不能天真的认为都用当时最新的就好。

2.有关错误日志,它真的是展示错误,解决问题的最好途径,无论何时都要认真的把错误日志看完,仔细分析,认真推敲,不要一遇到问题就拿着错误日志的第一行去网上百度,因为一句话通常只有很少的信息,网上找到的方法不一定真的是你的问题的解决方法啊。常常同一个错误,有可能是不同地方的问题引起的,要学会自己debug,确定根源仔细分析。

3.遇到一个实在解决不了的bug时,如果不是特别紧急,就先放一放,歇会儿,然后换个角度思考,也许就会轻松解决。不然人总是容易在一个死胡同里越走越深,最后,嗯,很崩溃的感觉。

### 问题分析 `java.lang.NoClassDefFoundError: Could not initialize class SpringJUnit4ClassRunner caused by java.lang.ExceptionInInitializerError` 是一个典型的类加载失败问题,通常发生在静态初始化阶段。该错误表示 JVM 在尝试加载 `SpringJUnit4ClassRunner` 类,由于其静态初始化模块抛出异常而无法完成初始化过程。 #### 可能的原因包括: - **依赖版本冲突**:例如,Spring 框架与 JUnit 的版本不兼容,或者存在多个版本的 Spring 测试库共存。 - **静态代码块或静态变量初始化失败**:在 `SpringJUnit4ClassRunner` 或其依赖类中,某个静态初始化逻辑抛出了异常(如 `ExceptionInInitializerError`)[^1]。 - **类路径配置错误**:缺少必要的类文件或资源文件,导致类加载失败。 - **JVM 环境问题**:如 JDK 版本不兼容、类加载器问题等。 --- ### 解决方法 #### 1. 检查日志中的 `ExceptionInInitializerError` 查找完整的堆栈跟踪,确认是否有 `ExceptionInInitializerError` 异常信息。该异常通常是引发 `NoClassDefFoundError` 的根本原因。例如: ```java Caused by: java.lang.ExceptionInInitializerError at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:100) Caused by: java.lang.NullPointerException at ... ``` 上述示例表明,在 `SpringJUnit4ClassRunner` 静态初始化过程中发生了 `NullPointerException`,需要定位具体代码位置并修复。 #### 2. 检查依赖版本一致性 确保项目中使用SpringJUnit 版本是兼容的。例如,如果使用的是 Spring Boot 2.x,则应搭配 JUnit 4JUnit Jupiter (JUnit 5) 的适配器;若使用 Spring Boot 3.x,则需使用 JUnit 5 并注意 Jakarta EE 包名的变化。 Maven 示例(Spring Boot 2.x + JUnit 4): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` Maven 示例(Spring Boot 3.x + JUnit 5): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.9.3</version> <scope>test</scope> </dependency> ``` #### 3. 清理和重新构建项目 执行以下命令以清理并重新下载依赖项: ```bash mvn clean install ``` 或使用 Gradle: ```bash gradle clean build ``` #### 4. 使用最新版本的测试框架 升级到最新的 Spring Boot 和测试工具版本,可以避免已知的类加载问题和 bug。 #### 5. 自定义 Runner 替代方案 如果仍然存在问题,可以考虑使用 `SpringRunner`(JUnit 4)或 `SpringExtension`(JUnit 5)替代 `SpringJUnit4ClassRunner`: JUnit 4 示例: ```java @RunWith(SpringRunner.class) @SpringBootTest public class MyTest { // Test code here } ``` JUnit 5 示例: ```java @ExtendWith(SpringExtension.class) @SpringBootTest public class MyTest { // Test code here } ``` --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值