一文教會你如何在 Spring 中進行集成測試,太讚了

不得不說,測試真的是過重要了!但並非全部的開發者都這樣認爲,這種感受在我回到洛陽後尤爲強烈。居然有團隊成員不經測試就把代碼提交到代碼庫,而且是會報錯的那種,我天吶,遇到這種隊友我也是醉了。java

我以前是在一家日企工做,他們很是注重測試,佔用的時間比代碼編寫的時間多多了。從單元測試到集成測試,全部的測試結果都要整理成文檔保存下來,哪怕你以爲徹底沒有必要。但正是這種一絲不苟的態度,成就了日企軟件高質量的美譽。git

單元測試一般比較簡單,對運行環境的依賴性不強。但集成測試就徹底不一樣了,須要整個項目是可以跑起來的,好比說須要數據庫是鏈接的,網絡是通暢的等等。程序員

集成測試最簡單的形式是:把兩個已經測試過的單元組合成一個組件,測試它們之間的接口。從這一層意義上講,組件是指多個單元的集成聚合。在現實方案中,許多單元組合成組件,而這些組件又聚合爲程序的更大部分。方法是測試片斷的組合,並最終擴展成進程,將模塊與其餘組的模塊一塊兒測試。最後,將構成進程的全部模塊一塊兒測試。github

Spring 提供了 Spring TestContex Framework 來支持集成測試,它不依賴於特定的測試框架,所以你能夠選擇 Junit,也能夠選擇 TestNG。本文選擇 Junit,所以須要先將 Junit 和 Spring TestContex Framework 的依賴添加到 pom.xml 文件中。web

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.2.RELEASE</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
複製代碼

準備工做完成後,來考慮這樣一個場景,咱們須要同時爲開發環境和生產環境維護數據源配置,所以咱們先建立一個公共的接口 Datasource,內容以下所示:spring

public interface Datasource {
    public void setup();
}
複製代碼

新建 DevDatasource 類,實現 Datasource 接口,該類用於爲開發環境配置數據源,內容以下:數據庫

@Component
@Profile("dev")
public class DevDatasource implements Datasource {
    @Override
    public void setup() {
        System.out.println("開發環境");
    }
}
複製代碼

@Component 註解用於爲 Spring 容器注入一個通用的 Bean 組件。@Profile 註解用於標識不一樣環境下要實例化的 Bean,字符串「dev」 表示該組件用於開發環境。編程

新建 ProdDatasource 類,實現 Datasource 接口,該類用於爲正式運行環境配置數據源,內容以下:微信

@Component
@Profile("prod")
public class ProdDatasource implements Datasource {
    @Override
    public void setup() {
        System.out.println("正式環境");
    }
}
複製代碼

新建配置類 SpringTestConfig,內容以下:網絡

@Configuration
@ComponentScan("test")
public class SpringTestConfig {
}
複製代碼

@Configuration 註解表示當前類爲一個配置類,@ComponentScan 註解用於指定掃描路徑,該路徑下的 Bean 將會自動裝配到 Spring 容器中。

基於 Maven 構建的項目默認有兩個測試目錄,src/test/java 和 src/test/resources,分別對應於 src/main/java 和 src/main/resources。前者用於測試項目源碼,後者用於測試項目資源。

咱們在 src/test/java 目錄下新建測試類 DevTest,內容以下:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("dev")
@ContextConfiguration(classes = { SpringTestConfig.class })
public class DevTest {
    @Autowired
    Datasource datasource;

    @Test
    public void testSpringProfiles() {
        Assert.assertTrue(datasource instanceof DevDatasource);
    }
}
複製代碼

1)@RunWith 註解用於指定 Junit 運行環境,是 Junit 提供給其餘框架測試環境的接口擴展,Spring 提供了 org.springframework.test.context.junit4.SpringJUnit4ClassRunner 做爲 Junit 測試環境。

2)@ActiveProfile 註解用於指定哪一個配置文件處於活動狀態,本例爲開發環境「dev」。

3)@ContextConfiguration 註解用於指定配置類,本例爲 SpringTestConfig 類。

4)@Autowired 註解用於指定 Spring 要自動裝配的 Bean。

5)@Test 註解用於表示當前方法爲 Junit 測試方法。

程序運行的結果以下圖所示:

再新建一個測試類 ProdTest,內容以下:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("prod")
@ContextConfiguration(classes = { SpringTestConfig.class })
public class ProdTest {

    @Autowired
    Datasource datasource;

    @Autowired
    Environment environment;

    @Test
    public void testSpringProfiles() {
        for (String profileName : environment.getActiveProfiles()) {
            System.out.println("當前激活的 profile - " + profileName);
        }
        Assert.assertTrue(datasource instanceof ProdDatasource);
    }
}
複製代碼

此次使用 @ActiveProfiles("prod") 註解指定當前環境爲正式運行下的環境。本例中咱們裝配了一個新的 Bean environment,使用它的 getActiveProfiles() 方法能夠獲取當前激活的 Profile。程序運行的結果以下圖所示:

好了,我親愛的讀者朋友,以上就是本文的所有內容了,是否是感受在 Spring 中進行集成測試仍是挺簡單的?若是以爲文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀,回覆關鍵字「 併發」更有一份阿里大牛重寫的《Java併發編程》。示例代碼已經上傳到 GitHub,傳送門~

我是沉默王二,一枚有趣的程序員。原創不易,莫要白票,請你爲本文點個贊吧,這將是我寫做更多優質文章的最強動力。

相關文章
相關標籤/搜索