首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC Controller 單元測試?別寫了,JUnit 主攻 Service 層才是正道

     編輯:程式設計綜合問答

你的 Controller 太重,測不動

貼出的 FeeBillClosedController 近 500 行,混雜:

  • HTTP 參數綁定、Session 操作
  • 複雜業務邏輯:多表關聯查詢、實體轉換、權限校驗
  • 直接操作 HttpServletRequest/Response

這樣的 Controller 單元測試需 Mock 全套 Servlet 容器、Spring 上下文、數據庫連接,成本極高且脆弱。

JUnit 正確測試層級

重構建議:把業務邏輯下沉到 Service

// 原 Controller 內聯邏輯
@Service
public class FeeBillClosedService {
    @Transactional(readOnly = true)
    public DataGrid list(FeeBillClosedEntity query, DataGrid grid) {
        // 複雜 CriteriaQuery 組裝、多表關聯、數據轉換
        // 單元測試只需 Mock systemService、feeBillClosedService
    }
    
    @Transactional
    public void delete(String id) { ... }
}

Controller 變薄:

@RequestMapping(params = "datagrid")
public void datagrid(FeeBillClosedEntity q, DataGrid grid, HttpServletResponse resp) {
    feeBillClosedService.list(q, grid); // 一行委派
    TagUtil.datagrid(resp, grid);
}

Service 層單元測試範例

@RunWith(MockitoJUnitRunner.class)
public class FeeBillClosedServiceTest {
    @Mock SystemService systemService;
    @InjectMocks FeeBillClosedService service;

    @Test
    public void list_shouldEnrichComName() {
        // Given
        FeeBillClosedEntity entity = new FeeBillClosedEntity();
        entity.setComFkid("c1");
        DataGrid grid = new DataGrid();
        grid.setResults(Arrays.asList(entity));
        
        when(systemService.singleResult(anyString())).thenReturn(
            new FeeComEntity().setContacts("張三").setPhone("13800000000"),
            new EcommerceRecordEntity().setEcommerceName("測試公司")
        );

        // When
        service.list(entity, grid);

        // Then
        assertEquals("測試公司", entity.getComName());
        verify(systemService, times(1)).singleResult(contains("FeeComEntity"));
    }
}

總結

別在 Controller 寫業務邏輯,別對 Controller 寫深度單元測試。 遵循「薄 Controller、厚 Service、可測試 Service」原則,JUnit 才能發揮最大價值。想測 HTTP 行為?上 MockMvc 做薄切面測試;想測全鏈路?寫 E2E 自動化腳本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級測試重點工具/策略
Service 層純業務邏輯:事務、計算、規則驗證JUnit + Mockito Mock Repository,核心測試目標
Repository 層SQL 正確性、映射關係@DataJpaTest + Testcontainers 真實 DB
Controller 層參數綁定、視圖解析、HTTP 狀態碼@WebMvcTest + MockMvc,薄測試
E2E全鏈路:瀏覽器→Controller→Service→DBSelenium / Cypress / Postman