不得不說,測試真的是過重要了!但並非全部的開發者都這樣認爲,這種感受在我回到洛陽後尤爲強烈。居然有團隊成員不經測試就把代碼提交到代碼庫,而且是會報錯的那種,我天吶,遇到這種隊友我也是醉了。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,傳送門~
我是沉默王二,一枚有趣的程序員。原創不易,莫要白票,請你爲本文點個贊吧,這將是我寫做更多優質文章的最強動力。