Spring本身即是一個容器,所有的業務對象都是通過Spring容器來管理。Spring的注入特點讓我們輕松地解除了類與類之間的耦合性。但是,也給我們寫單元測試帶來了不少的麻煩,不過這種情況是在沒有考慮Spring提供的單元測試工具的情況下才會發生的。
1. 准備需要的jar包。
需要准備spring-mock.jar和naming-factory-dbcp.jar。第一個jar包中包括了Spring提供的單元測試工具類,第二個jar包是提供建立JDBC連接所需要的類。
2. 繼承AbstractTransactionalDataSourceSpringContextTests。
Spring提供了幾種基於Junit的單元測試工具類,這裡只介紹AbstractTransactionalDataSourceSpringContextTests,其他的請看官方文檔。這是一個具有事務的單元測試用例,你可以設置單元測試成功後數據庫事務是提交還是回滾,默認為回滾。
在繼承類中需要實現getConfigLocations方法,這個方法主要是為了取得Spring的application-context.xml文件。
protected String[] getConfigLocations() {
String[] config = new String[] {
"xxx-applicationContext.xml", "xxxx-applicationContext.xml"
};
return config;
}
注意,第一,如果使用上面的寫法,這些xml文件必須在classpath下;第二,TransactionManager只能定義一個。
3. 寫自己的測試用例。
示例代碼如下:
public abstract class MyDependencyInjectionSpringContextTests
extends AbstractTransactionalDataSourceSpringContextTests {
protected ServiceContext context;
public MyDependencyInjectionSpringContextTests() {
}
/**
* 重寫父類的onSetUpBeforeTransaction方法
**/
protected void onSetUpBeforeTransaction() throws Exception {
super.onSetUpBeforeTransaction();
//此處可以加入你想進行的統一操作
......
//調用子類的處理
beforeSetUp();
}
protected abstract void beforeSetUp() throws Exception;
protected String[] getConfigLocations() {
String[] config = new String[] {
"service-applicationContext.xml", "dao-applicationContext.xml"
};
return config;
}
}
====================================================================
public class MockServiceTest
extends MyDependencyInjectionSpringContextTests {
Mock mock;
MockService service;
protected void beforeSetUp() throws Exception {
//初始化測試需要使用的數據
mock=new Mock();
mock.setName("test");
mock.setType(1);
service=(MockService) applicationContext.getBean("mockService");
}
public void testAddMock() {
//測試方法
service.addMock(mock);
//這裡使用的是是hibernate,增加後主鍵被填充,所以只要判斷實體對象的id是否為null即可
Assert.assertTrue("測試addMock方法失敗。" mock.getMockId!=null);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(MockServiceTest.class);
}
}