鏉ユ簮锛歟amonyin.blog.csdn.net涓€銆佸崟鍏冩祴璇曠殑姒傚康姒傚康锛氬崟鍏冩祴璇曪紙unittesting锛夋槸鎸囧杞欢涓渶灏忕殑鍙祴璇曞崟鍏冭繘琛屾鏌ュ拰楠岃瘉銆侸ava涓崟鍏冩祴璇曠殑鏈€灏忓崟浣嶆槸绫汇€傚崟鍏冩祴璇曟槸寮€鍙戜汉鍛樼紪鍐欑殑涓€灏忔浠g爜锛岀敤浜庨獙璇佽娴嬩唬鐮佺殑涓€涓皬鐨勩€佸畾涔夎壇濂界殑鍑芥暟鏄惁姝g‘銆傛墽琛屽崟鍏冩祴璇曞氨鏄负浜嗚瘉鏄庤繖娈典唬鐮佺殑琛屼负鏄惁绗﹀悎鎴戜滑鐨勯鏈熴€傚崟鍏冩祴璇曞弬鑰冿細浼楁墍鍛ㄧ煡锛岄€氳繃springinitialize鍒涘缓鐨凷pringBoot椤圭洰浼氬湪Maven涓嚜鍔ㄦ惡甯﹀緢澶歴tarter渚濊禆锛氬畠鍖呭惈涓€涓悕涓簊pring-boot-starter-test鐨勪緷璧栵紝鏈枃灏辨槸鍩轰簬杩欎釜渚濊禆銆傛垜涓嶄細浠嬬粛SpringBoot鐨勫熀纭€鐭ヨ瘑銆傛帹鑽愯鐪嬭繖涓厤璐规暀绋嬶細https://github.com/javastacks/spring-boot-best-practice鍦⊿pringBoot涓紩鍏ュ崟鍏冩祴璇曢潪甯哥畝鍗曘€傛坊鍔犲涓嬩緷璧栵紙鍗硈pring-boot-starter-test渚濊禆锛夛細org.springframework.bootspring-boot-starter-testtestspring-boot-starter-test鏈夊涓嬪嚑涓簱锛歴pring-boot-starter-testUML鍥撅細2.鍗曞厓娴嬭瘯鐨勪綔鐢ㄥ湪鎺ヨЕ鍗曞厓娴嬭瘯涔嬪墠鎴戜滑濡備綍娴嬭瘯锛熶竴鑸湁涓ょ鏂规硶锛氬湪鏃堕棿鍏佽鐨勬儏鍐典笅锛岀紪鍐欏崟鍏冩祴璇曟槸绋嬪簭鍛樺浠g爜鐨勮嚜鎴戞祴璇曪紝瀵硅嚜宸辩殑浠g爜璐熻矗銆傜紪鍐欏崟鍏冩祴璇曟湁涓や釜鍔ㄦ満锛氱‘淇濇垨楠岃瘉瀹炵幇鍔熻兘銆備繚鎶ゅ凡缁忓疄鐜扮殑鍔熻兘涓嶈鐮村潖銆?銆丼pringBoot寮曞叆鐨凪ockMvc鐨勬蹇典粈涔堟槸Mock锛熷湪闈㈠悜瀵硅薄缂栫▼涓紝妯℃嫙瀵硅薄锛堣嫳璇細mockobject锛夋槸浠ュ彲鎺ф柟寮忔ā鎷熺湡瀹炲璞¤涓虹殑鍋囧璞°€傚湪缂栫▼杩囩▼涓紝閫氬父浼氭ā鎷熶竴浜涜緭鍏ユ暟鎹潵楠岃瘉绋嬪簭鏄惁杈惧埌浜嗛鏈熺殑缁撴灉銆備负浠€涔堣浣跨敤Mock瀵硅薄锛熶娇鐢ㄦā鎷熷璞★紝鎮ㄥ彲浠ユā鎷熷鏉傜殑鐪熷疄瀵硅薄琛屼负銆傚鏋滃湪鍗曞厓娴嬭瘯涓笉鑳戒娇鐢ㄧ湡瀹炲璞★紝鍒欏彲浠ヤ娇鐢ㄦā鎷熷璞°€侻ockMvc鐨勬蹇礛ockMvc鐢眘pring-test鍖呮彁渚涳紝瀹炵幇妯℃嫙Http璇锋眰锛屽彲浠ョ洿鎺ヤ娇鐢ㄧ綉缁滅殑褰㈠紡锛岃浆鎹负Controller鐨勮皟鐢紝杩欐牱娴嬭瘯閫熷害蹇紝涓嶅彇鍐充簬缃戠粶鐜銆傚悓鏃舵彁渚涗簡涓€濂楅獙璇佸伐鍏凤紝瀵圭粨鏋滅殑楠岃瘉闈炲父鏂逛究銆傛帴鍙ockMvcBuilder鎻愪緵浜嗕竴涓嫭鐗圭殑鏋勫缓鏂规硶鏉ユ瀯閫燤ockMvc銆備富瑕佹湁涓や釜瀹炵幇锛歋tandaloneMockMvcBuilder鍜孌efaultMockMvcBuilder銆侻ockMVC鐨勫熀鏈楠?1)mockMvc.perform鎵ц涓€涓姹傘€?2)MockMvcRequestBuilders.get("XXX")鏋勯€犺姹傘€?3)ResultActions.param娣诲姞璇锋眰浼犲€?4)ResultActions.accept()璁剧疆杩斿洖绫诲瀷(5)ResultActions.andExpect娣诲姞鎵ц瀹屾垚鍚庣殑鏂█銆?6)ResultActions.andDo澧炲姞浜嗕竴涓粨鏋滃鐞嗗櫒锛屾剰鎬濇槸瀵圭粨鏋滃仛涓€浜涗簨鎯咃紝姣斿浣跨敤print()杈撳嚭鏁翠釜鍝嶅簲缁撴灉淇℃伅銆?7)ResultActions.andReturn琛ㄧず鎵ц瀹屾垚鍚庤繑鍥炵浉搴旂殑缁撴灉銆傚洓銆丼ervice灞傚崟鍏冩祴璇曠涓€姝ワ細SpringBoot涓殑鍗曞厓娴嬭瘯绫诲啓鍦╯rc/test/java鐩綍涓嬨€傚彲浠ユ墜鍔ㄥ垱寤哄叿浣撶殑娴嬭瘯绫伙紝涔熷彲浠ラ€氳繃IDEA鑷姩鍒涘缓娴嬭瘯绫伙紝濡備笅鍥撅細锛堟敞锛氱偣鍑绘墦寮€鐩稿簲鐨勪唬鐮佺晫闈紝鐒跺悗鐐瑰嚮鑿滃崟鏍忎腑鐨凬avigate锛夌浜屾锛氭牴鎹涓€姝ョ殑鏂规硶锛岀偣鍑绘祴璇曞悗锛屼細鍑虹幇濡傚浘1鎵€绀虹殑瀵硅瘽妗嗭紙濡傛灉浣犺娴嬭瘯鐨勭被宸茬粡瀛樺湪锛屾祴璇曠被浼氳鍒犻櫎鍒楄〃锛屼篃鍙互閲嶆柊鍒涘缓涓€涓柊鐨勬祴璇曠被锛夛紝鐐瑰嚮鈥淐reateNewTest...鈥濅細寮瑰嚭鍥?鐨勫璇濇锛屽彲浠ラ€夋嫨鏄惁鐢熸垚setUp鍜岃娴嬭瘯鐨勬垚鍛樻柟娉曪細绗笁姝ワ細鑷虫Service灞傜殑娴嬭瘯绫诲垱寤哄畬鎴愶紝鍦╯rc/test/java鐩綍涓嬬殑椤圭洰鍚岀骇鐩綍涓嬭嚜鍔ㄧ敓鎴愭祴璇曠被锛屽涓嬪浘锛歋ervice灞傛祴璇曚唬鐮佸涓嬶細@SpringBootTest@RunWith(SpringRunner.class)publicclassXXXServiceTest{@ResourceprivateXXXServiceXXXService;@TestpublicvoidconflictTime(){DateTimeFormatterdtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDatestart=LocalDate.parse("2020-10-26",dtf);LocalDateend=LocalDate.parse("2020-10-31",dtf);Integerinteger=XXXService.ConflictTime("10000001",start,end);Assert.assertThat(integer,Matchers.notNullValue());//assertThat鏂█鍚庨潰浼氫粙缁峿}娉ㄨВ璇存槑锛欯SpringBootTest锛氳幏鍙栧惎鍔ㄧ被锛屽姞杞介厤缃紝鎵惧埌涓婚厤缃惎鍔ㄧ被锛園SpringBootApplication娉ㄨВ锛堾RunWith(SpringRunner.class):璁㎎Unit杩愯Spring娴嬭瘯鐜锛岃幏寰桽pring鐜涓婁笅鏂囩殑鏀寔銆傛帹鑽愪竴涓紑婧愬厤璐圭殑SpringBoot鏈€鍏ㄦ暀绋嬶細https://github.com/javastacks/spring-boot-best-practice浜斻€丆ontroller灞傜殑鍗曞厓娴嬭瘯鍒涒€嬧€嬪缓娴嬭瘯绫绘楠よ绗洓閮ㄥ垎锛屽垎鍒槸杩欓噷鐪佺暐銆傜鍥涢儴鍒嗗彧娴嬭瘯浜哠ervice灞傦紝浣嗘槸鎴戜滑杩橀渶瑕佹祴璇旵ontroller灞傦紙API锛夈€傝繖鏃跺€欏氨鐢ㄥ埌浜哅ockMvc锛屽畠鍙互璁╀綘鍦ㄤ笉鍚姩椤圭洰鐨勬儏鍐典笅娴嬭瘯杩欎簺鎺ュ彛銆侻ockMvc瀹炵幇Http璇锋眰鐨勬ā鎷燂紝鍙互鐩存帴浣跨敤缃戠粶鐨勫舰寮忥紝杞崲涓篊ontroller鐨勮皟鐢紝鍙互浣挎祴璇曢€熷害鏇村揩锛屼笉渚濊禆浜庣綉缁滅幆澧冿紝骞舵彁渚涗簡涓€濂楅獙璇佸伐鍏凤紝鍙互璁╄姹傜殑鏍¢獙缁熶竴鏂逛究銆侰ontroller灞傜殑浠g爜浼氬垎鎴愪笁涓唬鐮佸潡鏉ヨ瑙o紝鏈夌湅涓嶆噦鐨勪唬鐮侊紝鍒潃鎬ワ紝鎴戜細鍦ㄧ浜旈儴鍒嗘渶鍚庝负澶у鎬荤粨瑙g瓟锛屽ぇ瀹惰鍧氭寔缁撴潫锛侌煒佷唬鐮佸潡涓€锛欯SpringBootTest@RunWith(SpringRunner.class)@AutoConfigureMockMvcpublicclassDfTaskRecordControllerTest{@AutowiredprivateMockMvcmockMvc;@BeforepublicvoidsetUp()throwsException{System.out.println("-------------寮€濮?-------鈥濓級;淇濆瓨锛堬級锛涜幏鍙栵紙锛夛紱System.out.println("================end=================");}娉ㄨВ瑙i噴锛欯SpringBootTest>锛氳幏鍙栧惎鍔ㄧ被锛屽姞杞介厤缃紝鎵惧埌涓婚厤缃惎鍔ㄧ被锛園SpringBootApplication鐨勬敞瑙o級@RunWith(SpringRunner.class)>锛氳JUnit杩愯Spring娴嬭瘯鐜锛岃幏鍙栨敮鎸丼pring鐜涓婁笅鏂囩殑@AutoConfigureMockMvc锛氱敤浜庤嚜鍔ㄩ厤缃甅ockMvc銆傞厤缃ソ鍚庯紝鍙互鐩存帴娉ㄥ叆MockMvc绫伙紝鐩稿綋浜巒ewMockMvc@Before:鍒濆鍖栨柟娉曚腑锛屼唬鐮佸潡2蹇呴』瀵规瘡涓祴璇曟柟娉曟墽琛屼竴娆★細@Test@Transactional@Rollback()publicvoidsave()throwsException{Stringjson"{...}";//鎵ц涓€涓猂equestBuilder璇锋眰锛屼細鑷姩鎵цSpringMVC娴佺▼骞舵槧灏勫埌瀵瑰簲鐨刢ontroller杩涜澶勭悊锛沵ockMvc.perform(MockMvcRequestBuilders.post("/XXX/save").content(json.getBytes())//浼爅son鍙傛暟.accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE).header("Authorization","Bearer*********-****-****-****-************").andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());}娉ㄨВ瑙i噴锛欯Transactional:寮€鍚簨鍔″姛鑳紷Rollback():浜嬪姟鍥炴粴锛岄粯璁や负trueget").param("id","********").header("鎺堟潈","鎵胯浇************-****-*****-****-*************"));resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");resultActions.andExpect(MockMvcResultMatchers.status().isOk())銆傚拰鍋氾紙鎵撳嵃锛堬級锛夛紱}}/get杩愯缁撴灉濡備笅锛氱幇鍦ㄦ€荤粨涓€涓嬩笂闈竴浜涚悙纰庣殑鐭ヨ瘑鐐癸細1.mockMvc.perform锛氭墽琛屼竴涓姹?.MockMvcRequestBuilders.get("/XXX/get")锛氭瀯閫犱竴涓姹傦紝Post璇锋眰浣跨敤.post鏂规硶3.contentType(MediaType.APPLICATION_JSON_VALUE)锛氬彂閫佺鍙戦€佺殑鏁版嵁鏍煎紡涓哄簲鐢ㄧ▼搴?json锛涘瓧绗﹂泦=UTF-84銆俛ccept(MediaType.APPLICATION_JSON)锛氳〃绀哄鎴风瑕佹帴鍙楃殑鏁版嵁绫诲瀷鏄痑pplication/json锛沜harset=UTF-85銆俬eader("Authorization","BearerXXXX"):琛ㄧず鍦╤eader涓坊鍔犱竴浜涘繀瑕佺殑淇℃伅锛岃繖閲屾槸token6.ResultActions.andExpect:娣诲姞鎵ц瀹屾垚鍚庣殑鏂█7.ResultActions.andExpect(MockMvcResultMatchers.status(.isOk()):璇ユ柟娉曟鏌ヨ姹傜殑鐘舵€佸搷搴旂爜鏄惁涓?00锛屽鏋滀笉鏄紝鍒欐姏鍑哄紓甯革紝娴嬭瘯澶辫触銆?.ResultActions.andDo锛氭坊鍔犱竴涓猺esulthandler锛岃〃绀鸿瀵圭粨鏋滃仛浜涗粈涔堬紝姣斿杩欓噷浣跨敤print()锛氳緭鍑烘暣涓搷搴旂粨鏋滀俊鎭?.鏂█鐨勬蹇垫柇瑷€锛坅ssert锛夛紝鏄竴涓紪绋嬫湳璇紝琛ㄧず涓轰竴浜涘竷灏旇〃杈惧紡锛岀▼搴忓憳璁や负璇ヨ〃杈惧紡鐨勫€煎湪绋嬪簭涓殑鏌愪竴鐐逛负鐪熴€傛偍鍙互闅忔椂鍚敤鍜岀鐢ㄦ柇瑷€楠岃瘉锛屽洜姝ゆ偍鍙互鍦ㄦ祴璇曟椂鍚敤鏂█銆傜鐢ㄩ儴缃叉柇瑷€銆備娇鐢ㄦ柇瑷€灏辨槸鍒ゆ柇涓€涓嚱鏁版垨鑰呬竴涓璞$殑鏂规硶浜х敓鐨勭粨鏋滄槸鍚︾鍚堜綘鏈熸湜鐨勭粨鏋溿€備竷銆佹柊鐨勬柇瑷€assertThat浣跨敤JUnit4.4缁撳悎Hamcrest鎻愪緵浜嗘柊鐨勬柇瑷€璇硶鈥斺€攁ssertThat銆傜▼搴忓憳鍙渶浣跨敤涓€鏉℃柇瑷€璇彞assertThat锛屽啀缁撳悎Hamcrest鎻愪緵鐨勫尮閰嶅櫒锛屽氨鍙互琛ㄨ揪鎵€鏈夌殑娴嬭瘯鎬濊矾銆俛ssertThat鐨勪紭鐐癸細浼樼偣涓€锛氳繃鍘籎Unit鎻愪緵浜嗗緢澶氭柇瑷€璇彞锛屾瘮濡傦細assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull绛夛紝鐜板湪JUnit4.4锛屼竴涓猘ssertThat鍙互鏇夸唬鎵€鏈夌殑鏂█璇彞锛岃浣犲彲浠ュ湪鎵€鏈夊崟鍏冩祴璇曚腑鍙娇鐢ㄤ竴绉嶆柇瑷€鏂规硶锛岃繖鏍锋洿瀹规槗缂栧啓娴嬭瘯鐢ㄤ緥锛屼唬鐮侀鏍煎彉寰楃粺涓€锛屾祴璇曚唬鐮佹洿瀹规槗缁存姢銆備紭鍔夸簩锛歛ssertThat浣跨敤浜咹amcrest鐨凪atcher鍖归厤鍣紝鐢ㄦ埛鍙互浣跨敤鍖归厤鍣ㄦ寚瀹氱殑鍖归厤鏉′欢鏉ョ簿纭寚瀹氫竴浜涜嚜宸辨兂瑕佽缃弧瓒崇殑鏉′欢锛岄潪甯告槗璇伙紝浣跨敤璧锋潵涔熸洿鍔犵伒娲汇€備紭鍔夸笁锛歛ssertThat涓嶅啀鍍廰ssertEquals閭f牱浣跨敤闅句互鐞嗚В鐨勨€滆皳璇?瀹捐-涓昏鈥濊娉曟ā寮忥紙濡傦細assertEquals(3,x);锛夈€傜浉鍙嶏紝assertThat閲囩敤浜嗕竴绉嶇被浼间簬鈥滀富-璋?瀹锯€濈殑鏄撹璇硶妯″紡锛堝assertThat(x,is(3));锛夛紝浣夸唬鐮佹洿鍔犵洿瑙傛槗璇汇€俛ssertThat鐨勫熀鏈娉曞涓嬶細assertThat([value],[matcherstatement]);value:鎺ヤ笅鏉ヨ娴嬭瘯鐨勫彉閲忕殑鍊硷紱matcher璇彞锛氬0鏄庝娇鐢℉amcrestmatchers琛ㄨ揪鐨勫墠涓€涓彉閲忕殑鏈熸湜鍊硷紝濡傛灉璇ュ€间笌matcher璇彞琛ㄨ揪鐨勬湡鏈涘€肩浉鍖归厤锛屽垯娴嬭瘯鎴愬姛锛屽惁鍒欐祴璇曞け璐ャ€?銆丳ostman鍜孲pringBoot鍗曞厓娴嬭瘯鐨勫尯鍒玈pringBoot鐨勫崟鍏冩祴璇曚富瑕侀拡瀵规柟娉曞眰闈紝鍙互娴嬭瘯Service灞傜瓑闈炴毚闇叉帴鍙g殑绫讳腑鐨勬柟娉曪紝鍙互涓€娆℃壒閲忔祴璇曞涓柟娉曞苟鏀寔浜嬪姟鍥炴粴銆侾ostman瀵规帴鍙h繘琛宧ttp娴嬭瘯銆傛垜涓€鑸兘鏈夊緢澶氾紝鍒涘缓濂界殑娴嬭瘯鐣岄潰鍙互淇濆瓨鍒嗙被銆備節銆侾ostman鐨勫熀鏈敤娉昉ostman鏄竴涓己澶х殑璋冭瘯缃戦〉鍜屽彂閫佺綉椤礖TTP璇锋眰鐨勫伐鍏枫€侾ostman鑳藉鍙戦€佷换浣曠被鍨嬬殑甯︽湁浠绘剰鏁伴噺鍙傛暟鍜孒TTP鏍囧ご鐨凥TTP璇锋眰锛圙ET銆丠EAD銆丳OST銆丳UT..锛夈€傛敮鎸佷笉鍚岀殑韬唤楠岃瘉鏈哄埗锛堝熀鏈€佹憳瑕併€丱Auth锛夛紝鎺ユ敹鍒扮殑鍝嶅簲锛圚TML銆丣SON鎴朮ML锛夌殑璇硶绐佸嚭鏄剧ず銆傚畨瑁匬ostman瀹樼綉锛歨ttps://www.getpostman.com/apps瀹夎鍚嶱ostman灏辨槸涓€涓緢濂界殑渚嬪瓙~~馃槉杩戞湡鐑枃鎺ㄨ崘锛?.1000+Java闈㈣瘯棰樺強绛旀锛?022鏈€鏂扮増锛?.鍘夊浜嗭紒Java鍗忕▼鏉ヤ簡銆?.3.SpringBoot2.x鏁欑▼锛屽お鍏ㄩ潰浜嗭紒4.涓嶈鐢ㄧ垎鐮寸垎婊$敾闈紝璇曡瘯瑁呴グ鑰呮ā寮忥紝杩欐墠鏄紭闆呯殑鏂瑰紡锛侊紒5.銆奐ava寮€鍙戞墜鍐岋紙宓╁北鐗堬級銆嬫渶鏂板彂甯冿紝璧跺揩涓嬭浇鍚э紒鎰熻涓嶉敊锛屽埆蹇樹簡鐐硅禐+杞彂锛?/p>