Spring 单元测试时使用@AutoWired为空 解决方法

使用@AutoWired遇到空指针

前几个月都去做AR项目了,有好长时间没学Spring了。。。最近在复习Spring,但是在做单元测试的时候碰到了问题,@AutoWired的使用应该没错,但是却爆出NullPointerException

public class TestService {
    @Autowired
    private  BookService bookService;

    @Test
    public void test01(){
        bookService.buyABook("Tom","book01");
    }
}

在这里插入图片描述
一开始我以为是@AutoWired的使用问题,但是在尝试之后发现,只有在单元测试或者main测试下使用@AutoWired注入的变量才会爆出null错误。。

解决方法

好在看到了这位大佬的帖子->利用 @Autowired 注入失效问题,发现其实加上两项注解就好了。加上注解后,可以看到输入恢复正常

@RunWith(SpringJUnit4ClassRunner.class)//让测试运行于Spring测试环境
@ContextConfiguration( locations = "classpath:test.xml")//提供配置信息
public class TestService {
    private ApplicationContext applicationContext=new ClassPathXmlApplicationContext("test.xml");
    @Autowired
    private  BookService bookService;

    @Test
    public void test01(){
        bookService.buyABook("Tom","book01");
    }
}

在这里插入图片描述

这里推荐使用maven工程,可以快速导入注解所需要的jar包,可以直接使用下面的依赖

	<!--如果只缺@RunWith这一项,只用导入junit.4.12这一个包就可以了-->
	<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>
	<!--如果SpringJUnit4ClassRunner也缺少,那就导入下面所有的包-->
	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework </groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework </groupId>
      <artifactId>spring-orm</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework </groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId> org.springframework </groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.9.RELEASE</version>
    </dependency>

关于问题的原因,我的理解是:JUnit4的测试环境不支持Spring,这时候如果想进行测试,就应该在Spring测试环境上测试@RunWith(SpringJUnit4ClassRunner.class) 的作用是让测试运行于Spring测试环境,@ContextConfiguration的作用就是提供配置信息

使用@RunWith和@ContextConfiguration仍然报错

有些小伙伴可能在成功使用注解的前提下遇到图中所示问题,其实这是因为你在导入org.junit.jupiter包的时候也导入了junit包,这两个包都有对应的@Test,这里必须要用junit包的@Test,所以只要更改导包内容就可以了
在这里插入图片描述

//注释掉import org.junit.jupiter.api.Test; 使用下面这句
import org.junit.Test;

main测试或使用static变量发生错误

有的小伙伴可能比较习惯通过main方法进行测试,比如下面这段代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( locations = "classpath:test.xml")
public class TestService {
    @Autowired
    private static BookService bookService;

    public static void main(String[] args) {
        bookService.buyABook("Tom","book01");
    }
}

但是请注意,这样做会发生错误,即使添加了@RunWith和@ContextConfiguration也仍然会发生错误!!

原因可参考这篇帖子:main方法里使用@AutoWired报错,在java中,静态变量的初始化顺序先于@AutoWired,而main方法只能在启动项目的时候才能加载配置文件,调用@AutoWired实现自动注入,此时静态变量的初始化早已结束,所以会发生错误

所以请注意,在spring测试中不要使用静态变量或者main方法!!

参考文献:

  • 44
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值