
嘻道奇闻
- 文章199742
- 阅读14625734
Java单元测试进阶:如何有效测试private方法的5种方案
锛堟墡蹇冧笁杩為棶锛変綘鏄笉鏄粡甯哥洴鐫€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鍚楋紵