首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 環境下業務層單元測試實戰:脫離容器的 TDD 之路

     編輯:Java 相關知識

為什麼只測業務層?

Web 層 (Struts Action / Spring MVC Controller) 多為組裝分派邏輯,真正的核心業務規則封裝在 Service/DAO 層。測試展示層工具 (HttpUnit, Selenium) 笨重且脆弱,不如專注於純 Java 業務邏輯的單元測試,享受:

  • 無需啟動 Tomcat,秒級反饋
  • 不依賴前端開發進度,並行開發
  • 資料庫自動回滾,測試資料隔離乾淨

Spring 測試支援兩大核心基類

  • 自動載入 applicationContext.xml
  • 自動依賴注入:protected 修飾的欄位自動 by-name 注入
  • 繼承 DI 功能
  • 強制交易回滾:每個測試方法跑在交易中,結束自動 rollback
  • 解決「測試髒資料清理」難題
  • 基類核心功能
    AbstractDependencyInjectionSpringContextTests
    AbstractTransactionalDataSourceSpringContextTests (繼承上者)

    封裝專屬基類:DAOTestCase

    public class DAOTestCase extends AbstractTransactionalDataSourceSpringContextTests {
        protected List<String> contexts = new ArrayList<>();
    
        public DAOTestCase() {
            // 關鍵:開啟 protected 欄位自動注入 (預設需 setter)
            setPopulateProtectedVariables(true);
            
            contexts.add("/applicationContext-Hibernate.xml");
            contexts.add("/applicationContext-SetupService.xml");
        }
    
        @Override
        protected String[] getConfigLocations() {
            return contexts.toArray(new String[0]);
        }
    }
    

    實際測試類別:極簡風格

    public class CustomerDAOTest extends DAOTestCase {
        // 自動注入,無需 setter
        protected CustomerDAO customerDAO;
    
        public void testGetCustomer() throws Exception {
            Customer customer = customerDAO.lookCustomer(1);
            assertEquals(1, customer.getCustomerNo());
        }
        
        public void testSaveCustomer() {
            Customer c = new Customer();
            c.setName("Test User");
            customerDAO.save(c);
            // 交易結束自動 rollback,資料庫不髒
        }
    }
    

    關鍵配置細節

    • setPopulateProtectedVariables(true):讓 protected 欄位直接注入,省去大量 setter 樣板碼。
    • 多個 Context 檔用 List 管理,getConfigLocations() 轉陣列。
    • 資料源需配置 DataSourceTransactionManager,測試才會真正交易化。

    進階技巧

    1. 資料準備:覆寫 onSetUpInTransaction() 插入測試基礎資料。
    2. 斷言豐富:善用 JUnit 4+ assertThat + Hamcrest,或 AssertJ 流暢 API。
    3. Mock 外部依賴:若 Service 呼叫 Web Service,用 @MockBean (Spring Boot) 或 EasyMock/Mockito 替換。

    結語

    Spring 的測試支援讓「脫容器測試業務層」成為現實。建立專屬基類一次,後續新增測試類極其輕量。這是 TDD 在 Java EE 專案落地的關鍵一步。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved