Spring中打樁測試(單元測試,使用@MockBean、@SpyBean)

Spring中單元測試(@MockBean、@SpyBean)

概述

在開發中,有時候我們的接口需要去遠程調用其他的接口,而在單元測試中,如果出現別人的接口沒有開發完成或者遠程服務不可用的情況,那麼單元測試就不能進行下去,這時候就需要使用到下面的測試方法了,可以讓我們指定遠程調用方法返回一個我們自己指定符合規則的返回值,不用受限於遠程接口的返回值,讓單元測試能夠進行下去

@MockBean

使用此註解注入的類,表明類中的所有方法都使用自定義返回的值,這樣在測試的時候就不會真的去調用遠程接口,而是返回一個我們預設的值

調用方法定義:TicketBuyOrderInfoVo getBuyOrderInfoVoByOrderId(@RequestParam("orderId") String orderId);

@MockBean
protected AirTicketBuyDataServiceFeignClient buyDataServiceFeignClient;

@Test
public void addComsumptions() {
	String json = "{\"buyOrderExtendBo\":{\"keyId\":\"1910081525037263066XXXX182\",\"orderId\":\"191008152448182781\",\"sellOrderId\":\"191008152447001294\",\"bookOffice\":\"\",\"outTicketOffice\":\"\",\"outTicketAccount\":\"18683561923\",\"outTicketPayAccount\":\"\",\"itineraryDispatchTypeID\":0,\"itineraryDispatchTypeName\":\"無行程單\",\"itineraryExpressMoney\":0.00,\"recipientName\":\"\",\"postAddress\":\"\",\"recipientPhoneNum\":\"\",\"itineryCreateState\":0,\"itineryCreateStateDes\":\"不需要\",\"itineryFailReason\":\"\",\"itineryOrderId\":\"\",\"key1\":\"0\",\"key2\":\"\",\"key3\":\"\",\"key4\":\"\",\"key5\":\"\",\"key6\":0,\"key7\":0,\"key8\":\"2019-10-08 15:25:04\",\"key9\":\"2019-10-08 15:25:04\",\"key10\":\"2019-10-08 15:25:04\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0,\"outPayType\":0,\"outPayAccount\":\"\",\"outPayTradeNo\":\"\",\"outPayBillNo\":\"\"},\"buyOrderInfoBo\":{\"keyID\":\"1910081525036229769XXXX182\",\"orderId\":\"191008152448182781\",\"sellOrderId\":\"191008152447001294\",\"tMCNo\":\"20160426135933567151\",\"tMCName\":\"小霞TMC0\",\"corpNo\":\"20160712160619032240\",\"corpName\":\"錦茵TMC\",\"serviceProviderID\":\"20180702000000000002\",\"serviceProviderName\":\"官網產品001\",\"supplyId\":\"20190730194131772844\",\"supplyName\":\"官網產品001\",\"orderType\":0,\"orderTypeName\":\"普通訂單\",\"ticketType\":0,\"voyageType\":0,\"voyageTypeName\":\"單程\",\"voyageLeg\":\"銀川-中衛\",\"voyageLegEn\":\"\",\"flightNos\":\"JR1509\",\"passengerCount\":1,\"passengers\":\"池魚\",\"passengerType\":0,\"takeOffTime\":\"2019-10-23 08:00:00\",\"pNR\":\"\",\"bigPNR\":\"\",\"newPnr\":\"\",\"newBigPnr\":\"\",\"bookingSource\":2,\"bookingSourceName\":\"IOS\",\"orderDisplayID\":0,\"orderDisplayName\":\"創單失敗\",\"orderChildDisplayID\":0,\"orderChildDisplayName\":\"\",\"orderFlag\":0,\"chanelId\":\"20\",\"chanelName\":\"QUNAR\",\"chanelOrderId\":\"D19297165242003581\",\"failReason\":\"佔座失敗\",\"ticketTotalMoney\":50.00,\"airraxTotalMoney\":0.00,\"oilraxTotalMoney\":0.00,\"insuranceTotalMoney\":0.00,\"itineraryTotalMoney\":0.00,\"taxTotalMoney\":0.00,\"payPoundage\":0.00,\"allPayMoney\":50.00,\"payType\":9,\"createOrderTime\":\"2019-10-08 15:24:48\",\"payTime\":\"2019-10-08 15:25:03\",\"outTicketTime\":\"2019-10-08 15:25:03\",\"cancelTicketTime\":\"2019-10-08 15:25:03\",\"linkMan\":\"池魚\",\"linkPhone\":\"15198186997\",\"linkEmail\":\"\",\"operatorCorpNo\":\"20160712160619032240\",\"operatorCorpName\":\"錦茵TMC\",\"operatorDeptNo\":\"20160712160619032240\",\"operatorDeptName\":\"錦茵TMC\",\"operatorUserNo\":\"20190212174322616761\",\"operatorUserName\":\"池魚\",\"importantLevel\":0,\"remark\":\"\",\"lockStatus\":0,\"lockStaffId\":\"\",\"lockStaffName\":\"\",\"lockTime\":\"2019-10-08 15:25:03\",\"addTime\":\"2019-10-24 20:08:16\",\"isDelete\":0,\"bankOrderId\":\"\",\"serviceFee\":0.00},\"buyTicketInfoBoList\":[{\"keyID\":\"1910081525036311800XXXX182\",\"orderId\":\"191008152448182781\",\"ticketNo\":\"\",\"userName\":\"池魚\",\"userEnglishName\":\"\",\"passengerIndex\":0,\"passengerType\":0,\"passengerTypeName\":\"\",\"passengerGender\":1,\"identity\":0,\"cardType\":0,\"cardTypeName\":\"身份證\",\"cardNo\":\"510902199601127713\",\"birthDay\":\"1996-01-12\",\"international\":\"\",\"passengerPhoneNum\":\"15198186997\",\"voyageLeg\":\"銀川-中衛\",\"voyageLegEn\":\"\",\"salesPrice\":50.00,\"oilrax\":0.00,\"airrax\":0.00,\"needItinerary\":0,\"itineraryMoney\":0.00,\"needInsurance\":0,\"insuranceMoney\":0.00,\"isNeedInsInvoice\":0,\"totalMoney\":50.00,\"ticketPrice\":50.00,\"tax\":0.00,\"cardValidityTime\":\"2019-10-08 15:24:30\",\"refundFlag\":0,\"isRefundFlag\":0,\"isRefundFlagName\":\"\",\"refundChangeModifyTime\":\"2019-10-08 15:25:04\",\"civilServantValidType\":0,\"cardBankID\":0,\"cardBankName\":\"\",\"budgetUnitName\":\"\",\"issueCountry\":\"\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0}],\"buyVoyageInfoBoList\":[{\"keyID\":\"1910081525036386708XXXX182\",\"orderId\":\"191008152448182781\",\"sequence\":0,\"carrier\":\"JR\",\"carrierName\":\"幸福\",\"flightNo\":\"JR1509\",\"cabin\":\"G\",\"cabinName\":\"經濟艙\",\"cabinType\":0,\"planType\":\"小\",\"deptCity\":\"INC\",\"arrCity\":\"ZHY\",\"deptCityCh\":\"銀川\",\"arrCityCh\":\"中衛\",\"deptAirport\":\"INC\",\"arrAirport\":\"ZHY\",\"deptAirportCh\":\"河東\",\"arrAirportCh\":\"香山機場\",\"deptTime\":\"2019-10-23 08:00:00\",\"arrTime\":\"2019-10-23 08:45:00\",\"orgJetquay\":\"T3\",\"dstJetquay\":\"\",\"discount\":\"9\",\"stopOver\":0,\"stopOverCity\":\"\",\"stopOverCityCh\":\"\",\"sOAirport\":\"\",\"sOAirportCh\":\"\",\"midTakeOffTime\":\"1900-01-01 00:00:00\",\"midArrTime\":\"1900-01-01 00:00:00\",\"isTransfer\":0,\"transferOrgSequence\":0,\"isShare\":0,\"reallyFlightNo\":\"\",\"policyId\":\"CL||\",\"returnPoint\":\"0\",\"isSelfCarrierTicket\":0,\"largeCustomerNum\":\"\",\"isStandardRule\":1,\"unStandardRule\":\"{\\\"isAllowedToSign\\\":1,\\\"changeTicketRuleInfo\\\":\\\"S:2019-10-16 08:00前|¥10\\\\/人^2019-10-21 08:00前|¥15\\\\/人^2019-10-23 04:00前|¥25\\\\/人^2019-10-23 08:00|¥35\\\\/人\\\",\\\"refundTicketRuleInfo\\\":\\\"S:2019-10-16 08:00前|¥15\\\\/人^2019-10-21 08:00前|¥25\\\\/人^2019-10-23 04:00前|¥45\\\\/人^2019-10-23 04:00後|¥50\\\\/人\\\",\\\"remark\\\":\\\"1.隨身攜帶1件行李,重量不超5KG,體積不超20*30*40CM;2.免費手動行李:20KG。\\\"}\",\"policyPlattype\":1,\"priceSource\":\"0\",\"policySign\":7,\"baggageCount\":0.00,\"baggageWeight\":0.00,\"isNightFlight\":0,\"flightType\":1,\"planModel\":\"\",\"flyTime\":\"\",\"subProductId\":\"\",\"policyExInfo\":\"{\\\"airAgentDiscount\\\":\\\"9\\\",\\\"oriClassDiscount\\\":\\\"0\\\",\\\"publicHighPrice\\\":\\\"0\\\",\\\"publicLowPrice\\\":\\\"0\\\",\\\"salePrice\\\":\\\"0\\\",\\\"calculateDiscount\\\":\\\"0\\\",\\\"prefMoney\\\":\\\"0\\\",\\\"ch_segId\\\":\\\"0\\\"}\",\"remark\":\"\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0}]}\n";
	TicketBuyOrderInfoVo orderInfoVo = GsonUtil.gson.fromJson(json, TicketBuyOrderInfoVo.class);
	
	when(buyDataServiceFeignClient.getBuyOrderInfoVoByOrderId(anyString())).thenReturn(orderInfoVo);
}

.thenReturn(orderInfoVo)就是我們設置的調用指定方法之後的返回值,這裏是返回一個TicketBuyOrderInfoVo對象

而即使不使用when().thenReturn()寫法,直接調用,方法返回值也爲Null
eg:

@Test
public void test() {
    buyDataServiceFeignClient.getBuyOrderInfoVoByOrderId("fewfw");
}

在這裏插入圖片描述

@SpyBean

使用此註解注入的類,表明類中的某一個方法使用使用自定義返回的值,在測試時,如果使用到了多個方法,那麼只是遵循@SpyBean寫法的方法會返回我們自定義的值,在使用時在使用方法上和@MockBean類似,不過寫法有所區別

調用方法定義:AutoOrder getAutoOrderByOrderId(String orderId, Date bizTime);

@SpyBean
protected IAutoTicketDao autoTicketDao;

@Test
public void addComsumptions_Out() {
    String json1 = "{\"orderID\":\"190801084547167995\",\"sellerDeptID\":\"340559\",\"orderStatus\":8,\"outTicketTime\":\"2019-08-01 08:54:33\",\"payCompanyOrderID\":\"FX2019080143357941\",\"outTradeNo\":\"NT19080100004112\",\"airCode\":\"ZH\",\"seatClass\":\"E\",\"takeOffTime\":\"2019-08-08 21:35:00\",\"fromCity\":\"CKG\",\"toCity\":\"SZX\",\"inStockStaff\":\"SZX49802\",\"ticketOutInterface\":10,\"airPayAccount\":\"SZCYSD517\",\"inStockTime\":\"2019-08-01 08:54:33\",\"bigCustomerID\":\"\",\"buyerDeptName\":\"雲南昆明盛世航空\",\"flightNO\":\"9428\",\"bigPNR\":\"PCYL5W\",\"orderPnr\":\"HM6XMK\"}";
    AutoOrder autoOrder = GsonUtil.gson.fromJson(json1, AutoOrder.class);
    
    doReturn(autoOrder).when(autoTicketDao).getAutoOrderByOrderId(anyString(), anyObject());

}

doReturn(autoOrder)就是我們設置的調用指定方法之後的返回值
遵循doReturn().when()寫法的會返回我們自己定義的返參,如果直接調用的話還是會真正調用服務

而在使用時,方法的入參也有所改變
eg:
AutoOrder getAutoOrderByOrderId(String orderId, Date bizTime),如果參數是String類型,測試時入參爲anyString(),如果爲對象類型,入參爲anyObject(),布爾類型爲anyBoolean(),Integer類型爲anyInt()......,還有很對類型相對應的方法,這裏不再贅述,,而如果方法的入參是一個固定的值,那麼在測試時也要寫爲相同的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章