1. 程式人生 > >SpringBoot使用@RunWith(Parameterized.class)進行引數化測試同時支援依賴注入,以及CommandLineRunner在單元測試時不執行主程序

SpringBoot使用@RunWith(Parameterized.class)進行引數化測試同時支援依賴注入,以及CommandLineRunner在單元測試時不執行主程序

問題提出

在使用SpringBoot進行單元測試的時候,我發現了兩個問題

  1. 使用引數化測試的時候,必須使用 @RunWith(Parameterized.class),而對Spring進行單元測試時,如果想使用依賴注入,即使用 @Autowired 註解,需要使用 @RunWith(SpringRunner.class) 。兩個不能同時使用。
  2. 如果 SpringBootApplication 在啟動時執行一個 CommandLineRunner,那麼在啟動單元測試的時候,會立即執行該Runner,但是我只想執行我的單元測試,並不想讓整個程式都啟動起來。

解決方案

我查了一下資料,發現相關的文章很少,Google了一下發現一篇文章

寫JUnit時既用Parameterized又用@Autowired出現無法成功自動注入的解決辦法 有提到相關的問題,但是這篇文章在關鍵位置排版太亂,看不清楚。於是自己嘗試著處理了一下。

Parameterized和SpringRunner

只使用 @RunWith(Parameterized.class),跟普通的引數化測試一樣。然後在測試類中新增以下幾行程式碼,就可以使用依賴注入了。

    @Before
    public void setUp() throws Exception {
        TestContextManager testContextManager = new
TestContextManager(getClass()); testContextManager.prepareTestInstance(this); }

單元測試啟動時不執行 CommandLineRunner

我的程式主要任務是監聽mq中的訊息。而單元測試只想測試每個Handler的處理邏輯是否正確。但是單元測試啟動的時候,會先啟動SpringBootApplication,於是我的監聽程式就啟動了。這並不是我想要的。特別是這個程式啟動之後要是一直阻塞在這裡的話,單元測試就無法進行了。 在這裡插入圖片描述

我查了一些資料,沒有找到滿意的解決方案。於是想了一個辦法。思路是在執行 run

方法的時候判斷一下當前的 Profile ,如果是 test 就直接返回,不執行後面的邏輯。(當然,這個前提是你單元測試使用的配置檔案中設定了 spring.profiles.active=test,正常都會這麼做) 在這裡插入圖片描述 以上兩個問題,如果你有更好的解決方案,可以在留言區留言,我們一起交流探討,謝謝!