基于jvm-sandbox的imock開發(fā)指南詳解
需求
- 支持java后端服務(wù)方法級(jí)別的mock,對(duì)沒有測(cè)試環(huán)境的第三方服務(wù)進(jìn)行mock,增加團(tuán)隊(duì)覆蓋率。
- 啟用,返回用戶自定義的mock響應(yīng)結(jié)果
- 停用,返回服務(wù)本身的結(jié)果
通過一系列調(diào)研,最終工具選型了基于 jvm-sandbox的mock服務(wù),是Java方法級(jí)別的mock,操作就是監(jiān)聽指定方法,返回指定的mock內(nèi)容。
1、項(xiàng)目介紹
imock 包含mock-module、mock-web ,mock-module就是jvm-sandbox的模塊,需要安裝到目標(biāo)應(yīng)用服務(wù)器,mock-web 為mock服務(wù)后臺(tái),imock是前后端分離,還有一個(gè)前端react 項(xiàng)目 imcok-web
ume_mock_backend :http://git1.local.umetrip.com/guanhongli/ume_mock_backend
ume_mock_frontend :http://git1.local.umetrip.com/guanhongli/ume_mock_frontend
2、imock使用
首先將前后端項(xiàng)目都跑起來,安裝依賴啥的先把環(huán)境調(diào)通。
2.1、啟動(dòng)imock-web
本地環(huán)境:直接idea啟動(dòng)即可
容器環(huán)境:java -jar啟動(dòng)
nohup?java?-jar?/opt/applog/MskyLog/mock/mock-web.jar?>?myout.txt?2>&1?&
2.2、準(zhǔn)備mock-module
2.2.0.本地安裝
到項(xiàng)目下的bin目錄執(zhí)行 install-local.sh,通過腳本編譯mock-module,如需修改代碼要重新執(zhí)行此腳本。
2.2.1.修改cfg
#?心跳上報(bào)配置??當(dāng)環(huán)境變量沒有配置的時(shí)候使用?該配置 #?mock?服務(wù)的地址和端口 mock.host=http://172.24.146.219:8003 #?標(biāo)識(shí)目標(biāo)應(yīng)用的名稱 app.name=test-umeapp-checkin #?標(biāo)識(shí)目標(biāo)應(yīng)用的環(huán)境 app.env=test-umeapp-checkin
2.2.2.拷貝到sandbox-module目錄
將cfg和mock-module拷貝到sandbox/sandbox-module目錄下。
cd?/opt/applog/MskyLog/mock cp?/opt/applog/MskyLog/mock/mock-module.jar??/opt/app/sandbox/sandbox-module cp?-r?/opt/applog/MskyLog/mock/cfg??/opt/app/sandbox/sandbox-module
2.2.3.拷貝到.sandbox-module目錄
cp?/opt/applog/MskyLog/mock/mock-module.jar?/opt/app/.sandbox-module
2.2.4.創(chuàng)建mock日志目錄
mkdir?-p?/home/jboss5/logs/sandbox/mock/
2.3、attch掛載目標(biāo)應(yīng)用
jps命令查看pid
cd?/opt/app/sandbox/bin/ ./sandbox.sh?-p?22
2.4、查看log
2.4.1、查看sandbox.log
tailf?/opt/applog/MskyLog/sandbox/sandbox.log
2.4.2、查看mock.log
tailf?/home/jboss5/logs/sandbox/mock/mock.log
2.4.3、查看服務(wù)log
結(jié)合log和error日志來看
tailf?/opt/applog/MskyLog/UmeCki/UmeCki_info.log tailf?/opt/applog/MskyLog/UmeCki/UmeCki_trace.log tailf?/opt/applog/MskyLog/UmeCki/UmeCki_err.log
3、遇到的問題
3.1、mock切面問題,增加before返回
看代碼mock邏輯是在afterReturning中實(shí)現(xiàn)的,這樣的話是不是原代碼邏輯還是會(huì)執(zhí)行,只是修改了返回給調(diào)用方的Object或者Exception。比如我想mock調(diào)用銀行支付邏輯,但是還是會(huì)實(shí)際支付,所以切面放在before(Advice advice)并且結(jié)合returnImmediately會(huì)不會(huì)效果更好。
作者的代碼afterReturning方法是通過advice.getReturnObj().getClass()來獲取類,然后把ro.getReturnData()序列化到對(duì)象中。
- 如果before方法,則advice.getReturnObj()為空,空指針無法獲取類對(duì)象。
- 如果mock方法的值返回為空,則依然無法獲取對(duì)象類型。
因此需要換一個(gè)方法獲取類對(duì)象
使用advice.getTarget()方法來獲取對(duì)象類型,使用advice.getBehavior()獲取方法名稱。
Method?method?=?advice.getTarget().getClass().getMethod(advice.getBehavior().getName()); returnType?=?method.getGenericReturnType(); LogUtil.info2("returnType=",?String.valueOf(returnType)); Object?res1?=?JSON.parseObject(ro.getReturnData(),?returnType); LogUtil.info2("res1=",?res1.toString());
但經(jīng)過測(cè)試只有springboot可以用,dubbo接口advice.getTarget()為空。
在 Dubbo 中,advice.getTarget()
返回 null
可能是由于 Dubbo 的代理機(jī)制導(dǎo)致的。Dubbo 使用代理對(duì)象來實(shí)現(xiàn)遠(yuǎn)程服務(wù)的調(diào)用,代理對(duì)象是在運(yùn)行時(shí)動(dòng)態(tài)生成的,而真正的目標(biāo)對(duì)象是通過 Dubbo 的遠(yuǎn)程調(diào)用機(jī)制獲取的。因此,在 Dubbo 的 Advice 中,advice.getTarget()
返回的是代理對(duì)象,而不是真正的目標(biāo)對(duì)象。由于代理對(duì)象并不是目標(biāo)對(duì)象本身,因此可能返回 null
。
在 Spring Boot 中,advice.getTarget()
返回的是目標(biāo)對(duì)象,因?yàn)?Spring Boot 使用的代理機(jī)制與 Dubbo 不同。Spring Boot 中的 AOP 代理通常是通過 JDK 動(dòng)態(tài)代理或 CGLIB 生成的,這些代理對(duì)象會(huì)保留對(duì)目標(biāo)對(duì)象的引用,因此在 Advice 中調(diào)用 advice.getTarget()
可以獲取到目標(biāo)對(duì)象的引用,不會(huì)返回 null
。
接著找其他的辦法。。。
通過advice.getBehavior().getReturnType()
Method?method?=?advice.getBehavior().getReturnType().getMethod(advice.getBehavior().getName());
完美解決!
//?獲取方法的返回對(duì)象類型 Object?res1?=?JSON.parseObject(ro.getReturnData(),?advice.getBehavior().getReturnType()); LogUtil.info2("res1=",?res1.toString());
3.2、報(bào)錯(cuò)time字段不為空
解決辦法:修改數(shù)據(jù)庫(kù)讓字段可以為空。
3.3、imock-web
java.lang.TypeNotPresentException: Type org.springframework.boot.maven.RepackageMojo not present
后續(xù)
至此,通過本地調(diào)試,二次開發(fā)imock已經(jīng)能夠符合我們公司的需求,后續(xù)再針對(duì)個(gè)性化的需求進(jìn)行開發(fā),更多關(guān)于jvm-sandbox imock開發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot整合springsecurity與mybatis-plus的簡(jiǎn)單實(shí)現(xiàn)
Spring Security基于Spring開發(fā),項(xiàng)目中如果使用Spring作為基礎(chǔ),配合Spring Security做權(quán)限更加方便,而Shiro需要和Spring進(jìn)行整合開發(fā)。因此作為spring全家桶中的Spring Security在java領(lǐng)域很常用2021-10-10基于Java實(shí)現(xiàn)抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于Java實(shí)現(xiàn)抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)
這篇文章主要介紹了Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01java在linux系統(tǒng)下開機(jī)啟動(dòng)無法使用sudo命令的原因及解決辦法
每次開機(jī)自動(dòng)啟動(dòng)的java進(jìn)程,頁(yè)面上的關(guān)機(jī)按鈕都無法實(shí)現(xiàn)關(guān)機(jī)功能,但是此時(shí)如果以chb賬號(hào)通過ssh登錄該服務(wù)器,手動(dòng)殺掉tomcat進(jìn)程,然后再重新啟動(dòng)tomcat,頁(yè)面上的關(guān)機(jī)按鈕就有效了2013-08-08Mybatis日志配置方式(slf4j、log4j、log4j2)
這篇文章主要介紹了Mybatis日志配置方式(slf4j、log4j、log4j2),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09idea 訪問html頁(yè)面端口號(hào)顯示的是63342而不是8080
這篇文章主要介紹了idea 訪問html頁(yè)面端口號(hào)顯示的是63342而不是8080,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08