天天看點

Spring內建Junit使用TestContext 測試架構

在junit測試架構裡我們已經有了幾個常見的注解來定義test case執行前後的回調行為。

 注釋  說明
 @Before  初始化方法
 @After  釋放資源
 @Test  測試方法
 @Ignore  忽略的測試方法
 @BeforeClass  針對所有測試,隻執行一次,且必須為static void
 @AfterClass  針對所有測試,隻執行一次,且必須為static void

這些方法可以滿足大多數應用的需求。但是Spring中也內建了Unit測試的功能,并且同樣定義了一些回調函數可以切入。

下面記錄下項目中的一個應用執行個體。

Dao的測試裡需要在每個測試方法之前都對相應的資料庫資料進行初始化。因為測試資料不是通過資料标示來區分不同case的。是以每次case測試前隻要将本case的資料初始化。這樣一來在測試方法開始之前,必須得到這個要測試的方法名。Junit的注解中@Before是在每個方法開始之前運作的,但是在裡面無法得到即将要測試的方法名。Junit沒有提供相應的機制給出測試中的流程資料。

這時我們就可以借助Spring提供的@TestExecutionListeners來插入這種回調。

class BeforeMethod implements TestExecutionListener {
	
	public static final Logger logger = Logger.getLogger(BeforeMethod.class);

	@Override
	public void afterTestClass(TestContext arg0) throws Exception {
	}

	@Override
	public void afterTestMethod(TestContext arg0) throws Exception {
	}

	@Override
	public void beforeTestClass(TestContext arg0) throws Exception {
	}

	@Override
	public void beforeTestMethod(TestContext con) throws Exception {
		
		String testClass = con.getTestClass().getSimpleName();
		logger.debug("database initialization class name: " + testClass);
		
		String testMethod = con.getTestMethod().getName();
		logger.debug("database initialization method name: " + testMethod);
		
		DBInitializer.doInit(testClass, testMethod);
	}

	@Override
	public void prepareTestInstance(TestContext arg0) throws Exception {
	}

}
           

TestContext 核心類、支援類以及注解類

TestContext 測試架構的核心由 org.springframework.test.context 包中三個類組成,分别是 TestContext 和 TestContextManager 類以及 TestExecutionListener 接口。

   1.TestContext:它封裝了運作測試用例的上下文;

   2.TestContextManager:它是進入 Spring TestContext 架構的程式主入口,它管理着一個 TestContext 執行個體,并在适合的執行點上向所有注冊在 TestContextManager 中的 TestExecutionListener 監聽器釋出事件:比如測試用例執行個體的準備,測試方法執行前後方法的調用等。

   3.TestExecutionListener:該接口負責響應 TestContextManager 釋出的事件。

Spring TestContext 允許在測試用例類中通過 @TestExecutionListeners 注解向 TestContextManager 注冊多個監聽器,如下所示:

@TestExecutionListeners( { 
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class })
public class TestXxxService{
    …
}
      

DependencyInjectionTestExecutionListener:該監聽器提供了自動注入的功能,它負責解析測試用例中 @Autowried 注解并完成自動注入。

在 JUnit中可以通過 @RunWith 注解指定測試用例的運作器,Spring TestContext 架構提供了SpringJUnit4ClassRunner 運作器,它負責總裝 Spring TestContext 測試架構并将其統一到 JUnit架構中。

最終監聽器類和TestContext的使用通過在Test類上的注解來定義 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@TestExecutionListeners({ BeforeMethod.class, DependencyInjectionTestExecutionListener.class })
public class DaoTestBase {
	
}