Web 層 (Struts Action / Spring MVC Controller) 多為組裝分派邏輯,真正的核心業務規則封裝在 Service/DAO 層。測試展示層工具 (HttpUnit, Selenium) 笨重且脆弱,不如專注於純 Java 業務邏輯的單元測試,享受:
| 基類 | 核心功能 |
|---|---|
AbstractDependencyInjectionSpringContextTests |
|
AbstractTransactionalDataSourceSpringContextTests (繼承上者) |
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 樣板碼。List 管理,getConfigLocations() 轉陣列。DataSourceTransactionManager,測試才會真正交易化。onSetUpInTransaction() 插入測試基礎資料。assertThat + Hamcrest,或 AssertJ 流暢 API。@MockBean (Spring Boot) 或 EasyMock/Mockito 替換。Spring 的測試支援讓「脫容器測試業務層」成為現實。建立專屬基類一次,後續新增測試類極其輕量。這是 TDD 在 Java EE 專案落地的關鍵一步。