使用Spring TestContext Framework對程序進行單元測試有兩種方式,一種是測試類繼承AbstractJUnit4SpringContextTests或繼承AbstractTransactionalJUnit4SpringContextTests,並且使用@ContextConfiguration注解來指定配置文件的位置,如果不置頂配置文件的位置的話,它會默認測試目標類的全限名加上"-context.xml"(eg: com.sch.services.UserService默認的配置文件為:classpath:com/sch/services/UserService-context.xml).
先來看一下AbstractJUnit4SpringContextTests和AbstractTransactionalJUnit4SpringContextTests的原型,了解兩者的區別:
AbstractJUnit4SpringContextTests:
@RunWith(SpringJUnit4ClassRunner.class) //指定測試用例運行器 @TestExecutionListeners( // 注冊了兩個TestExecutionListener監聽器 { DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class }) public class AbstractJUnit4SpringContextTests implements ApplicationContextAware { … }
AbstractTransactionalJUnit4SpringContextTests:
可以看出AbstractTransactionalJUnit4SpringContextTests 是繼承於AbstractJUnit4SpringContextTests 並增加了一個TransactionalTestExecutionListener監聽器,可見AbstractTransactionalJUnit4SpringContextTests 增加了測試類對事物的控制,可見測試類可以使用注解也可以使用繼承抽象類。
接下來看一下3個監聽器的作用:
DependencyInjectionTestExecutionListener提供了依賴注入的功能,它負責解析測試類中的@Autowried和@Resource注解
DirtiesContextTestExecutionListener只要的作用是處理測試類中的上下文遭到破壞時,重新注冊上下文,即在測試方法上使用@DirtiesContext啟用;當測試方法被@DirtiesContext注解修飾時,當測試方法結束的時候,Spring TestContext會刷新Spring的上下文(就是重新創建ApplicationContext)。
TransactionalTestExecutionListener主要負責解析和事物操作有關的注解,例如:@Transaction、@BeforeTransaction、@AfterTransaction、@NotTransactional 以及 @Rollback。
下面來看一下測試相關注解的簡單說明:
@TransactionConfiguration使用在類級別上,里面有兩個屬性,transactionManager 指定事物管理器的名字,默認的名稱為:transactionManager;defaultRollback 配置全局默認的事務回滾,默認為:false。
@BeforeTransaction和@AfterTransaction可見是在需要事物的測試方法執行前后調用,和JUnit4中@Before、@After注解類型,當時前者會忽略聲明了@NotTransactional注解的測試方法。
@NotTransactional修飾那些不需要事物的測試方法。
@Rollback可以改變測試方法的回滾方式,例如@Rollback(true)可以是測試方法的事物設置為執行完后事物馬上回滾。
還有一些注解的使用方法可以參考Spring Reference。