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

文章目录

      • 问题说明:
      • 解决方法:

问题说明:

最近学习了一下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注入为空值_第1张图片
最后在往常查了半天,发现原来是因为我在测试类中使用service层接口ArticleDao的方法是通过new的方式加入的:
SpringBoot Service层测试时用@Autowired注入为空值_第2张图片
而这种方式不能将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注入为空值_第3张图片

你可能感兴趣的:(#,java学习笔记)