欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot Service层测试时用@Autowired注入为空值

程序员文章站 2024-03-15 19:38:12
...

问题说明:

最近学习了一下SpringBoot,编写一个测试项目时发现在Service中使用的@Autowired注解自动注入的值在测试时,出现空指针异常;

java.lang.NullPointerException
	at com.will.glob.willglob.Service.impl.AritcleDaoImpl.getOneById(AritcleDaoImpl.java:34)
	at com.will.glob.willglob.WillGlobApplicationTests.contextLoads(WillGlobApplicationTests.java:27)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)

错误测试代码如下:

    @Test
    @Transactional
    public void contextLoads() {
        ArticleDao articleDao=new AritcleDaoImpl();
        Article article=new Article();
        article=articleDao.getOneById(1L);
        System.out.println(article);
    }

ArticleDao接口的实现类代码如下:

@Service
public class AritcleDaoImpl implements ArticleDao {
    @Autowired
    ArticleRepository articleRepository;
    @Autowired
    CommRepository commRepository;
    @Autowired
    UsersRepository usersRepository;

    @Override
    public Article getOneById(Long artId) {
        Article article=new Article();

        article=  articleRepository.getOne(artId);
        System.out.println(article);
        return article;
    }
  }

最后debug之后发现用@Autowired注入的几个JPA接口全是空值;注入失败:
SpringBoot Service层测试时用@Autowired注入为空值
最后在往常查了半天,发现原来是因为我在测试类中使用service层接口ArticleDao的方法是通过new的方式加入的:
SpringBoot Service层测试时用@Autowired注入为空值
而这种方式不能将AritcleDaoImpl()实现类交由SpringBoot接管,但是该类中通过@Autowired注入的几个接口都必须通过Spring容器接管才能自动注入,所以自然就无法注入值了;

解决方法:

既然使用了SpringBoot来开发,那最好就是尽善尽美的利用它设定的方便途径,将接口之类的,全部用@Autowired注解进行注入的方式,来交给Spring托管:

    @Autowired
    ArticleDao articleDao;
    @Test
    @Transactional
    public void contextLoads() {
        Article article=new Article();
        article=articleDao.getOneById(1L);
        System.out.println(article);
    }

测试截图:
SpringBoot Service层测试时用@Autowired注入为空值