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

Java void 方法詳解與 Mockito 單元測試實戰

     編輯:Java 相關知識

void 方法基礎

void 關鍵字表示方法無返回值。調用 void 方法必須作為獨立語句,以分號結尾:

public static void printGrade(double score) {
    if (score >= 90) System.out.println('A');
    else if (score >= 80) System.out.println('B');
    // ...
}
// 調用
printGrade(78.5); // 輸出 C

Service 層 void 方法測試難點

業務邏輯中大量 save*、update* 等 void 方法,無返回值驗證,需通過以下方式測試:

  • 驗證方法內部調用了哪些依賴(DAO、外部服務)
  • 捕獲傳遞給依賴的參數進行斷言
  • 驗證異常拋出場景

Mockito 實戰:驗證 updateRuleName 參數

被測方法

@Override
public void updateRuleName(Long ruleId, String newRuleName, Long ucId) {
    Assert.notNull(ruleId, "規則ID不能為Null");
    Assert.notNull(newRuleName, "規則名稱不能為Null");
    Assert.notNull(ucId, "操作人UCID不能為Null");
    String cleanName = StringUtils.trim(newRuleName);
    if (StringUtils.isBlank(cleanName)) throw new IllegalArgumentException("新規則名稱不能為空");
    Rule rule = queryRuleById(ruleId);
    if (rule == null) throw new IllegalDataException("未查到該規則");
    rule.setRuleName(cleanName);
    rule.setUpdateUcid(ucId);
    rule.setUpdateTime(new Date());
    ruleDao.updateSelective(rule);
}

測試代碼

@Test
public void testUpdateRuleName() {
    Long ruleId = 1L, ucId = 123L;
    String newRuleName = "newRuleName";
    List rules = new ArrayList<>();
    Rule rule = new Rule();
    rule.setRuleStatus((byte) 1);
    rules.add(rule);
    // Stub 查詢
    Map params = new HashMap<>();
    params.put("ruleId", ruleId);
    Mockito.when(ruleDao.queryRulesByCondition(params)).thenReturn(rules);
    // 捕獲 updateSelective 參數進行斷言
    Mockito.doAnswer(new Answer() {
        @Override public Object answer(InvocationOnMock invocation) {
            Rule r = (Rule) invocation.getArguments()[0];
            Assert.assertTrue(r.getRuleName().equals("newRuleName"));
            return null;
        }
    }).when(ruleDao).updateSelective(Mockito.any(Rule.class));
    // 執行測試
    ruleService.updateRuleName(ruleId, newRuleName, ucId);
}

核心原理解析

  • doAnswer + Answer 接口實現攔截器模式
  • 調用鏈:ruleDao.updateSelective(rule) → Mockito 攔截器 → 靜態代理 → Answer.answer() → 獲取 InvocationOnMock 參數 → 斷言
  • 適用於任意 void 方法的參數驗證、異常模擬、回調觸發

最佳實踐建議

  1. 優先驗證核心業務參數傳遞正確性
  2. 對於狀態變更類方法,輔以查詢方法驗證持久化結果
  3. 異常路徑單獨編寫測試用例,使用 Mockito.doThrow() 模擬
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved