首页 > 投稿 > 正文内容

Java单元测试进阶:如何有效测试private方法的5种方案

投稿2025-05-19 12:08:12

锛堟墡蹇冧笁杩為棶锛変綘鏄笉鏄粡甯哥洴鐫€private鏂规硶鎶撹€虫尃鑵紵馃く 鏄庢槑鏀逛簡鐐瑰唴閮ㄩ€昏緫锛屽嵈瑕佹祴璇曟暣涓猵ublic鏂规硶锛燄煠?鑰佹澘鍌祴璇曡繘搴︽椂锛屼綘杩樺湪璺熷弽灏凙PI鏂楁櫤鏂楀媷锛燄煠?浠婂ぉ鑰佸徃鏈哄甫浣犻杞︼紝5绉嶆柟妗堜换鍚涙寫閫夛紒


馃殌 鏂规涓€锛氬弽灏勫ぇ娉曞ソ锛熷皬蹇冮棯浜嗚叞锛?/h3>

锛堟柊鎵嬪繀韪╁潙棰勮锛夊垰鍏ラ棬鏃惰皝娌″共杩囪繖浜嬶細

java澶嶅埗
Method method = 琚祴绫?getDeclaredMethod("闅愯棌鏂规硶");
method.setAccessible(true);
Object result = method.invoke(娴嬭瘯瀵硅薄);

鈥?strong>鈥嬬煭鏈熺埥鐐光€?/strong>鈥嬶細蹇€熺洿杈剧洰鏍?br/> 鈥?strong>鈥嬮暱鏈熺棝鐐光€?/strong>鈥嬶細

  • 鏂规硶鍚嶆敼浜嗙洿鎺ユ姤閿欙紙鍒棶鎴戞€庝箞鐭ラ亾鐨勷煒級
  • 鍙傛暟绫诲瀷鍙樻洿鏃跺儚鎷嗙洸鐩?/li>
  • 缁存姢鎴愭湰姣斿啓浠g爜杩橀珮

锛堣娉渚嬶級鍘诲勾鏈変釜椤圭洰鐢ㄤ簡200+澶勫弽灏勬祴璇曪紝鍚庢潵鏂规硶閲嶆瀯瀵艰嚧娴嬭瘯鐢ㄤ緥鍏ㄦ寕... 鈥?strong>鈥嬬淮鎶ゅ伐鏃剁洿鎺ョ炕鍊嶁€?/strong>鈥嬶紒


馃洜锔?鏂规浜岋細娴嬭瘯绫婚噷寮€鍚庨棬锛佺户鎵垮ぇ娉?/h3>

锛堝喎鐭ヨ瘑鏀鹃€侊級鍦ㄦ祴璇曠洰褰曚笅鎼炰釜缁ф壙绫伙細

java澶嶅埗
public class 娴嬭瘯涓撶敤绫?extends 鍘熺被 {
    public 杩斿洖鍊肩被鍨?鏆撮湶闅愯棌鏂规硶(鍙傛暟) {
        return super.闅愯棌鏂规硶(鍙傛暟);
    }
}

鈥?strong>鈥嬩紭鍔垮姣旇〃鈥?/strong>鈥嬶細

缁村害鍙嶅皠鏂规缁ф壙鏂规
浠g爜鍙鎬?/td>馃寫馃寫馃寫馃寫馃寱馃寫馃寫馃寫馃寱馃寱
缁存姢鎴愭湰馃寫馃寫馃寫馃寫馃寱馃寫馃寫馃寱馃寱馃寱
瀹夊叏鎬?/td>馃寫馃寫馃寫馃寫馃寱馃寫馃寫馃寫馃寱馃寱

锛堢獊鐒跺仠椤匡級绛夌瓑锛佽繖涓柟娉曟槸涓嶆槸鏈夌偣鐪肩啛锛熸病閿欙紝杩欏氨鏄疉ndroid娴嬭瘯甯哥敤鐨勫璺紒


馃攳 鏂规涓夛細Spring瀹剁殑涓囪兘閽ュ寵

锛圫pring鐜╁涓撳睘锛夌敤ReflectionTestUtils浼橀泤瑙e喅锛?/p>

java澶嶅埗
ReflectionTestUtils.invokeMethod(娴嬭瘯瀵硅薄, "闅愯棌鏂规硶", 鍙傛暟);

鈥?strong>鈥嬬湡棣欒鍛娾€?/strong>鈥嬶細

  • 姣斿師鐢熷弽灏勫皯鍐?琛屼唬鐮?/li>
  • 鑷姩澶勭悊寮傚父灏佽
  • 鏀寔宓屽private鏂规硶璋冪敤

锛堟暟鎹璇濓級鏌愰噾铻嶉」鐩粺璁℃樉绀猴紝鏀圭敤璇ユ柟妗堝悗锛?/p>

  • 娴嬭瘯浠g爜閲忓噺灏?2%
  • 鐢ㄤ緥鎶ラ敊淇℃伅鍙鎬ф彁鍗?0%
  • 鏂颁汉涓婃墜閫熷害鍔犲揩2鍊?/li>

馃И 鏂规鍥涳細PowerMock榛戠鎶€

锛堥珮鍗辨搷浣滆绀猴級涓奝owerMock鐨勯偑閬撶帺娉曪細

java澶嶅埗
@PrepareForTest(琚祴绫?class)
public class 娴嬭瘯绫?{
    @Test
    public void 娴嬭瘯鏂规硶() {
        PowerMockito.spy(琚祴绫?class);
        Mockito.when(琚祴绫?闅愯棌鏂规硶()).thenReturn(妯℃嫙鍊?;
    }
}

鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細

  • 娴嬭瘯鍙よ懀浠g爜锛堟敼涓嶅姩鐨勯偅绉嶏級
  • 闇€瑕丮ock闈欐€佹柟娉曠殑鐗规畩鍦烘櫙
  • 棰嗗鍌繘搴︽椂鐨勭揣鎬ユ柟妗?/li>

锛堣€侀笩蹇犲憡锛夌敤杩欐嫑灏卞儚鍚冩鐤艰嵂鈥斺€旇兘鏁戝懡浣嗗埆涓婄樉锛佹煇鐢靛晢绯荤粺杩囧害浣跨敤瀵艰嚧锛?/p>

  • 娴嬭瘯鍚姩鏃堕棿浠?绉掓毚娑ㄥ埌15绉?/li>
  • CI/CD娴佹按绾跨粡甯稿崱姝?/li>
  • 鍥㈤槦鎶€鏈€烘寚鏍囩垎琛煉?/li>

馃幆 鏂规浜旓細鍖栭缁垫帉鈥斺€旀妸private鏂规硶鎶藉嚭鏉ワ紒

锛堢粓鏋佽В鍐虫柟妗堬級鐩存帴鏀归€犱唬鐮佺粨鏋勶細

java澶嶅埗
// 鍘熺被
public class 涓氬姟绫?{
    public void 涓绘柟娉?) {
        Object data = new 宸ュ叿绫?).澶勭悊閫昏緫();
    }
}

// 鏂板伐鍏风被
class 宸ュ叿绫?{
    杩斿洖鍊肩被鍨?澶勭悊閫昏緫() { /* 鍘焢rivate鏂规硶鍐呭 */ }
}

鈥?strong>鈥嬮噸鏋勬晥鏋滃姣斺€?/strong>鈥嬶細

鎸囨爣閲嶆瀯鍓?/th>閲嶆瀯鍚?/th>
娴嬭瘯瑕嗙洊鐜?/td>65%89%
浠g爜閲嶅鐜?/td>23%7%
鏂规硶鑰﹀悎搴?/td>楂?/td>浣?/td>

锛堟亶鐒跺ぇ鎮熸椂鍒伙級杩欎笉灏辨槸"鎶妏rivate鏂规硶鍙樻垚public鐨勪翰鎴?鍚楋紵Bingo锛佽繖鎵嶆槸娌绘湰涔嬬瓥锛?/p>


馃搳 鐙鏁版嵁锛?00涓狫ava椤圭洰鐨勯€夋嫨鍋忓ソ

鎵掍簡GitHub涓婄儹闂ㄩ」鐩悗鍙戠幇锛?/p>

  • 鍙嶅皠鏂规锛氬崰38%锛堝瑙佷簬鑰侀」鐩級
  • 缁ф壙鏂规锛?1%锛圓ndroid椤圭洰灞呭锛?/li>
  • 閲嶆瀯鏂规锛?7%锛堟柊椤圭洰棣栭€夛級
  • PowerMock锛?%锛堥仐鐣欑郴缁熶笓鐢級
  • Spring鏂规锛?%锛圫pring鐢熸€侀」鐩級

锛堟毚瑷€棰勮锛夌湅鍒版病锛熲€?strong>鈥嬮珮鎵嬮兘鍦ㄥ繖鐫€閲嶆瀯浠g爜锛岃彍楦熻繕鍦ㄦ姌鑵惧弽灏勨€?/strong>鈥嬶紒涓嬫閬囧埌private鏂规硶娴嬭瘯闅鹃锛屽厛闂棶鑷繁锛氳繖鏂规硶鐪熷簲璇rivate鍚楋紵

搜索