今天写springboot项目的单元测试,测试需要整个项目启动完成后,才能进行测试。但是写测试类的时候遇到了大概2个问题:
1. 单元测试启动后不执行主程序方法,bean没有初始化就直接进到测试方法了,导致报NullPointException.
折腾了半天,看到一篇文章提到版本不同导致注入不成功。
于是检查了pom,将Spring-Boot-Starter-Test的版本指定到Spring-Boot-Starter相同的版本。再次运行测试方法,成功加载Spring运行主程序。我使用的版本是 2.1.0.RELEASE 。
2.Spring主程序能启动后,发现程序执行半天,定时器都开始跑了,却一直没有进入测试方法的断点上去,重试几次都不行,就是一直进不去Junit Test的测试方法。主程序的那个小黄圈圈一直在转,我就怀疑是不是要哪里标记Spring程序初始化完了,才会进入Junit Test的测试方法。
折腾了好久,看到一篇文章提到阻塞,我马上想到是不是Spring主入口方法阻塞,在入口类的SpringApplication.run()代码后面打印一行字,这行字也打印不出来。想到主线程不来就阻塞的,不然程序就退出了。
这时候我想到了项目有个类有实现CommandLineRunner接口,在他的run()方法里有一个while死循环,是用来初始化一些东西的,会随着整个系统一直运行。我就想应该是这里阻塞了,于是把这个死循环放到一个threadPool里。再次运行测试方法,成功进入测试方法断点。问题解决!
附上那篇带阻塞关键字的文章地址:https://blog.csdn.net/we