《Spring 5官方文檔》11集成測試 (二)
11.3 JDBC測試支持
org.springframework.test.jdbc是包含JdbcTestUtils的包,它是一個JDBC相關的工具方法集,意在簡化標準數據庫測試場景。特別地,JdbcTestUtils提供以下靜態工具方法:
- countRowsInTable(..):統計給定表的行數。
- countRowsInTableWhere(..):使用提供的where語句進行篩選統計給定表的行數。
- deleteFromTables(..):刪除特定表的全部數據。
- deleteFromTableWhere(..):使用提供的where語句進行篩選並刪除給定表的數據。
- dropTables(..):刪除指定的表。
注意AbstractTransactionalJUnit4SpringContextTests和AbstractTransactionalTestNGSpringContextTests 提供了委托給前麵所述的JdbcTestUtils中的方法的簡便方法。
spring-jdbc模塊提供了配置和啟動嵌入式數據庫的支持,可用於與數據庫交互的集成測試中。
詳見Section 15.8, “嵌入式數據庫支持”和 ection 15.8.5, “使用嵌入式數據庫測試數據訪問邏輯”。
11.4 注解
11.4.1 Spring測試注解
Spring框架提供以下Spring特定的注解集合,你可以在單元和集成測試中協同TestContext框架使用它們。請參考相應的JAVA幫助文檔作進一步了解,包括默認的屬性,屬性別名等等。、
@BootstrapWith
@BootstrapWith是一個用於配置Spring TestContext框架如何引導的類級別的注解。具體地說,@BootstrapWith用於指定一個自定義的TestContextBootstrapper。請查看引導TestContext框架作進一步了解。
@ContextConfiguration
@ContextConfiguration定義了類級別的元數據來決定如何為集成測試來加載和配置應用程序上下文。具體地說,@ContextConfiguration聲明了用於加載上下文的應用程序上下文資源路徑和注解類。
資源路徑通常是類路徑中的XML配置文件或者Groovy腳本;而注解類通常是使用@Configuration注解的類。但是,資源路徑也可以指向文件係統中的文件和腳本,解決類也可能是組件類等等。
public class |
class |
public class |
作為聲明資源路徑或注解類的替代方案或補充,@ContextConfiguration可以用於聲明ApplicationContextInitializer類。
class |
public class |
@ContextConfiguration偶爾也被用作聲明ContextLoader策略。但注意,通常你不需要顯示的配置加載器,因為默認的加載器已經支持資源路徑或者注解類以及初始化器。
class |
public class |
![]() |
@ContextConfiguration默認對繼承父類定義的資源路徑或者配置類以及上下文初始化器提供支持。 |
參閱Section 11.5.4, 上下文管理和@ContextConfiguration幫助文檔作進一步了解。
@WebAppConfiguration
@WebAppConfiguration是一個用於聲明集成測試所加載的ApplicationContext須是WebApplicationContext的類級別的注解。測試類的@WebAppConfiguration注解隻是為了保證用於測試的WebApplicationContext會被加載,它使用”file:src/main/webapp”路徑默認值作為web應用的根路徑(即,資源基路徑)。資源基路徑用於幕後創建一個MockServletContext作為測試的WebApplicationContext的ServletContext。
public class |
注意@WebAppConfiguration必須和@ContextConfiguration一起使用,或者在同一個測試類,或者在測試類層次結構中。請參閱@WebAppConfiguration幫助文檔作進一步了解。
@ContextHierarchy
@ContextHierarchy是一個用於為集成測試定義ApplicationContext層次結構的類級別的注解。@ContextHierarchy應該聲明一個或多個@ContextConfiguration實例列表,其中每一個定義上下文層次結構的一個層次。下麵的例子展示了在同一個測試類中@ContextHierarchy的使用方法。但是,@ContextHierarchy一樣可以用於測試類的層次結構中。
public class |
class |
class |
public class |
如果你想合並或者覆蓋一個測試類的層次結構中的應用程序上下文中指定層次的配置,你就必須在類層次中的每一個相應的層次通過為@ContextConfiguration的name屬性提供與該層次相同的值的方式來顯示地指定這個層次。請參閱上下文層次關係和@ContextHierarchy幫助文檔來獲得更多的示例。
@ActiveProfiles
@ActiveProfiles是一個用於當集成測試加載ApplicationContext的時候聲明哪一個bean definition profiles被激活的類級別的注解。
public class |
public class |
![]() |
@ActiveProfiles默認為繼承激活的在超類聲明的 bean definition profiles提供支持。通過實現一個自定義的 ActiveProfilesResolver並通過@ActiveProfiles的resolver屬性來注冊它的編程的方式來解決激活bean definition profiles問題也是可行的。 |
參閱使用環境profiles來配置上下文和@ActiveProfiles幫助文檔作進一步了解。
@TestPropertySource
@TestPropertySource是一個用於為集成測試加載ApplicationContext時配置屬性文件的位置和增加到Environment中的PropertySources集中的內聯屬性的類級別的注解。
測試屬性源比那些從係統環境或者Java係統屬性以及通過@PropertySource或者編程方式聲明方式增加的屬性源具有更高的優先級。而且,內聯屬性比從資源路徑加載的屬性具有更高的優先級。
下麵的例子展示了如何從類路徑中聲明屬性文件。
public class |
下麵的例子展示了如何聲明內聯屬性。
@ContextConfiguration
@TestPropertySource(properties = { “timezone = GMT”, “port: 4242″ })
public class MyIntegrationTests {
// class body…
}
@DirtiesContext
@DirtiesContext指明測試執行期間該Spring應用程序上下文已經被弄髒(也就是說通過某種方式被更改或者破壞——比如,更改單例bean的狀態)。當應用程序上下文被標為”髒”,它將從測試框架緩存中被移除並關閉。因此,Spring容器將為隨後需要同樣配置元數據的測試而被重建。
@DirtiesContext可以在同一個類或者類層次結構中的類級別和方法級別中使用。在這個場景下,應用程序上下文將在任意此注解的方法之前或之後以及當前測試類之前或之後被標為“髒”,這取決於配置的methodMode和classMode。
下麵的例子解釋了在多種配置場景下什麼時候上下文會被標為“髒”。
- 當在一個類中聲明並將類模式設為BEFORE_CLASS,則在當前測試類之前。
public class |
- 當在一個類中聲明並將類模式設為AFTER_CLASS(也就是,默認的類模式),則在當前測試類之後。
public class |
- 當在一個類中聲明並將類模式設為BEFORE_EACH_TEST_METHOD,則在當前測試類的每個方法之前。
public class |
- 當在一個類中聲明並將類模式設為AFTER_EACH_TEST_METHOD,則在當前測試類的每個方法之後。
public class |
- 當在一個方法中聲明並將方法模式設為BEFORE_METHOD,則在當前方法之前。
public void |
- 當在一個方法中聲明並將方法模式設為AFTER_METHOD(也就是說,默認的方法模式),則在當前方法之後。
public void |
如果@DirtiesContext被用於上下文被配置為通過@ContextHierarchy定義的上下文層次中的一部分的測試中,則hierarchyMode標誌可用於控製如何聲明上下文緩存。默認將使用一個窮舉算法用於清除包括不僅當前層次而且與當前測試擁有共同祖先的其它上下文層次的緩存。所有在擁有共同祖先上下文的子層次的應用程序上下文都會從上下文中被移除並關閉。如果窮舉算法對於特定的使用場景顯得有點威力過勐,那麼你可以指定一個更簡單的當前層算法來代替,如下所。
public class |
public class extends |
public void |
參閱DirtiesContext.HierarchyMode幫助文檔以獲得窮舉和當前層算法更詳細的了解。
@TestExecutionListeners
@TestExecutionListeners定義了一個類級別的元數據,用於配置需要用TestContextManager進行注冊的TestExecutionListener實現。通常,@TestExecutionListeners與@ContextConfiguration一起使用。
classclass |
public class |
@TestExecutionListeners默認支持繼承監聽器。參閱幫助文檔獲得示例和更詳細的了解。
@Commit
@Commit指定事務性的測試方法在測試方法執行完成後對事務進行提交。@Commit可以用作@Rollback(false)的直接替代,以更好的傳達代碼的意圖。和@Rollback一樣,@Commit可以在類層次或者方法層級聲明。
public void |
@Rollback
@Rollback指明當測試方法執行完畢的時候是否對事務性方法中的事務進行回滾。如果為true,則進行回滾;否則,則提交(請參加@Commit)。在Spring TestContext框架中,集成測試默認的Rollback語義為true,即使你不顯示的指定它。
當被聲明為方法級別的注解,則@Rollback為特定的方法指定回滾語義,並覆蓋類級別的@Rollback和@Commit語義。
@Rollback(false)
@Test
public void testProcessWithoutRollback() {
// …
}
@BeforeTransaction
@BeforeTransaction指明通過Spring的@Transactional注解配置為需要在事務中執行的測試方法在事務開始之前先執行注解的void方法。從Spring框架4.3版本起,@BeforeTransaction方法不再需要為public並可能被聲明為基於Java8的接口的默認方法。
@BeforeTransaction
void beforeTransaction() {
// logic to be executed before a transaction is started
}
@AfterTransaction
@AfterTransaction指明通過Spring的@Transactional注解配置為需要在事務中執行的測試方法在事務結束之後執行注解的void方法。從Spring框架4.3版本起,@AfterTransaction方法不再需要為public並可能被聲明為基於Java8的接口的默認方法。
@AfterTransaction
void afterTransaction() {
// logic to be executed after a transaction has ended
}
@Sql
@Sql用於注解測試類或者測試方法,以讓在集成測試過程中配置的SQL腳本能夠在給定的的數據庫中得到執行。
public void |
請參閱通過@sql聲明執行的SQL腳本作進一步了解。
@SqlConfig
@SqlConfig定義了用於決定如何解析和執行通過@Sql注解配置的SQL腳本。
public void |
@SqlGroup
@SqlGroup是一個用於聚合幾個@Sql注解的容器注解。@SqlGroup可以直接使用,通過聲明幾個嵌套的@Sql注解,也可以與Java8的可重複注解支持協同使用,即簡單地在同一個類或方法上聲明幾個@Sql注解,隱式地產生這個容器注解。
public void |
8 |
} |
最後更新:2017-05-18 10:32:34