Spring整合JUnit4之java.lang.ExceptionInInitializerError

这几日学习Spring,在整合JUnit4的时候出现bug,经过几天终于解决掉了。
遇到bug时,解决过程中难免心烦意乱,心灰意冷,做什么都没信心,进而否定自己。可愈是压抑,解决后的喜悦也愈是深刻。
下面记录一下遇到的问题及解决办法:
异常反馈代码(部分)如下:

java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

import javax.annotation.Resource;

import org.junit.runner.RunWith;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.itheima.demo1.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo2 {
    @Resource(name="userService")
    private UserService UserService;

    @Test
    public void run1(){
        UserService.sayHell();
    }
}

整个编译过程是没有任何报错的。对run1()进行JUnit Test后如图:
这里写图片描述
因为自己是按照黑马的教学视频进行学习,整个过程包括jar包严格一致,所以根本不知道问题在哪。这是jar包截图:
这里写图片描述
jar包对应的都是4.2.4,而且视频中也未出现问题,所以真的是捉急。(其实此时我已经能确定是test包出现了问题)怀疑是不是JDK不匹配的问题,所以把自己的JDK从1.6换到了1.8,但是问题依旧,此时排除了JDK版本原因,安心解决test.jar包问题。
在下图单击右键,选择Copy Trace
这里写图片描述
然后粘贴到记事本中,发现问题
这里写图片描述
把问题具体定位到SpringJUnit4ClassRunner ,而这个问题与包import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;相关,此时就已经完全可以定位到test.jar包上。
需要提升test.jar包版本
下面是操作:
这里写图片描述
然后打开计算机,进行粘贴,打开文件位置
这里写图片描述
下载一个更高级别的junit.jar,替换下图中的junit.jar
这里写图片描述
楼主用的是junit-4.12.jar,然后粘贴进去替换掉junit.jar
此时需要注意,替换进去的jar包应该和原jar包同名,不然程序依旧无法运行。
至此问题就已经全部解决掉。至于如何发现要把名字改为同名,可以继续往下看:
工程上右击–>Properties–>Java Build Path–>Libraries
这里写图片描述
missing即找不到,它是按照名字进行查找,所以把jar包名字换成原名。


以上就是解决问题全过程,大牛勿笑。

### 关于JUnit测试中`java.lang.NullPointerException`的原因 当在JUnit测试过程中遇到`java.lang.NullPointerException`错误时,通常是因为尝试访问未初始化的对象实例或变量所引起的。具体到与Spring Boot集成的场景下,如果使用的`@Test`注解来自JUnit4,则该注解本身并不会自动创建Spring应用上下文,因此可能导致依赖注入失败,进而引发空指针异常[^1]。 对于Redis操作相关的测试案例,在执行涉及数据库连接的操作之前如果没有正确配置数据源或者启动相应的服务端口也会抛出同样的异常[^3]。 另外一种常见情况是在使用MyBatis框架进行持久层开发并编写相应单元测试的情况下,若缺少必要的配置文件引入或是映射器接口实现不当同样会触发此类异常[^4]。 最后,项目构建路径设置不当时也可能间接造成某些资源加载失败从而导致此问题发生[^5]。 ### 如何解决 `java.lang.NullPointerException` 针对上述提到的不同原因可以采取如下措施: #### 使用适当版本的JUnit注解 为了确保兼容性和功能正常运作,建议采用最新版的JUnit Jupiter API中的`@Test`替代旧有的JUnit4版本,并确认所有相关依赖项均已更新至匹配版本。 ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.x.x</version> <scope>test</scope> </dependency> ``` #### 正确配置Spring Boot测试环境 通过添加`@RunWith(SpringRunner.class)`(适用于JUnit4)或者是`@ExtendWith(SpringExtension.class)`(推荐用于JUnit5),可以让测试运行在一个完整的Spring应用程序环境中,这样就能保证所有的Bean都能被成功注入而不为空值。 ```java import org.springframework.boot.test.context.SpringBootTest; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.junit.jupiter.SpringExtension; @SpringBootTest @ExtendWith(SpringExtension.class) public class SampleTest { } ``` #### 配置外部资源和服务 如果是由于第三方组件如Redis等原因造成的异常,则需仔细检查对应的客户端库是否已正确定义以及服务器状态是否良好;必要时可以在测试前手动建立连接以验证连通性。 #### 审查项目结构和依赖关系 确保项目的classpath包含了所有必需的jar包和其他静态资源文件夹;同时注意IDE内部可能存在的编译选项差异影响最终打包结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值