解決Spring boot 整合Junit遇到的坑
這是我在使用springboot整合Junit的時候遇到的坑
1.在pom.xml中添加junit環境的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
2.在src/test/java下建立測試類
例:
@RunWith(value = SpringJUnit4ClassRunner.class) @SpringBootTest(classes={Demo.class}) // **註意:啟動類為自己編寫的(這是個坑)** public class serviceTest { @Autowired private serviceImpl serviceimpl; @Test public void testAdd() { this.serviceimpl.add(); } }
3.自己編寫的啟動類
@SpringBootApplication public class Demo { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Demo.class); // 這個是關閉springboot啟動時候的圖標可以不設置 springApplication.setBannerMode(Banner.Mode.OFF); springApplication.run(args); } }
說明:
@RunWith:啟動器 SpringJUnit4ClassRunner.class:讓 junit 與 spring 環境進行整合
@SpringBootTest(classes={App.class})
1:當前類為 springBoot 的測試類
2:加載 SpringBoot 啟動類(啟動類為自己編寫的啟動類(這是個坑))。啟動SpringBoot
SpringBoot 整合Junit測試註入Bean失敗
java.lang.IllegalStateException: Failed to load ApplicationContext
問題描述
我是在springboot整合測試的時候報錯的。運行就是報各種bean找不到。
版本:springboot-1.5.12 + junit4.12
這個問題卡瞭半天才解決。從網上搜瞭若幹個博客都試瞭,基本上都沒有用。
什麼加@WebAppConfiguration這個註解啊,加那個註解的,全沒用。
下面是我的測試類
11111
解決過程
我仔細觀察瞭一下啟動類,因為這個@SpringBootTest我是設置的啟動類的。才發現原來註入的這些找不到的bean,實際上都是啟動類當中使用依賴註入的對象。
以下是我的啟動類
由此我推斷,雖然springboot自帶瞭掃描包(默認掃描規則就是啟動類以上的子包),但是他可能是遵循java的由上而下執行代碼規律,因為他畢竟是整合測試,他和直接從啟動類啟動項目是不一樣的概念。在他要依賴註入這個對象的時候,而實際上這個對象並沒有放到容器當中,這時候就會產生註入不成功。
最終在啟動類添加瞭一個@ComponentScan(basePackages = {“com.xjgx”})掃描全包。成功解決!
在配置類上添加 @ComponentScan 註解。該註解默認會掃描該類所在的包下所有的配置類,相當於之前的 context:component-scan。
總結
springboot整合junit測試方法,實際上就這兩個註解就可以瞭。
@RunWith(SpringRunner.class) @SpringBootTest(classes = EhrApplication.class) public class EhrApplicationTest { @Autowired HealthExamReSerivice healthExamReSerivice; @Test public void contextLoads() { } }
假如啟動類使用到瞭依賴註入對象,這個時候需要在啟動類上添加掃描包。
@ComponentScan(basePackages = {"com.xjgx"})
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springBoot Junit測試用例出現@Autowired不生效的解決
- SpringBoot項目中@Test不出現可點擊運行的按鈕問題
- springboot 啟動如何排除某些bean的註入
- 單元測試 @mock與@SpringBootTest的使用
- SpringBoot與單元測試JUnit的結合操作