SpringBoot利用Junit動(dòng)態(tài)代理實(shí)現(xiàn)Mock方法
說(shuō)到Spring Boot 單元測(cè)試主要有兩個(gè)主流集成分別是Mockito
,Junit
,這個(gè)各有特點(diǎn),在實(shí)際開(kāi)發(fā)中,我想要的測(cè)試框架應(yīng)該是這個(gè)框架集成者。要有Junit
能夠運(yùn)行某一個(gè)單元用例,完整的項(xiàng)目環(huán)境,又需要Mockito
能對(duì)某一個(gè)依賴進(jìn)行注入,指定返回值內(nèi)容??上?shí)際中這兩個(gè)框架根本不能同時(shí)運(yùn)行的。突然想到可以通過(guò)AOP的環(huán)繞通知來(lái)實(shí)現(xiàn)Mock注入功能,覆蓋某一個(gè)方法返回值。 現(xiàn)在有一個(gè)Feign接口AService,實(shí)際情況我們環(huán)境根本就沒(méi)有這個(gè)服務(wù),調(diào)用這個(gè)方法一定會(huì)報(bào)錯(cuò)的。通過(guò)代理技術(shù)的環(huán)繞通知覆蓋返回值,能讓方法正常調(diào)用。具體代碼實(shí)現(xiàn)如下
Feign 代碼
@FeignClient(name = "application-a") public interface AFeignService { @RequestMapping("/url/path/get") Result<Object> get(); }
測(cè)試用例
@SpringBootTest @Slf4j class AFeignServiceTest { @Autowired private AFeignService aFeignService; @Test void get() { Result<Object> result = aFeignService.get(); log.info(JSONObject.toJSONString(result)); } }
執(zhí)行測(cè)試用例,一定會(huì)出錯(cuò),缺少代理方法 在test中添加代理配置類(lèi)
@Aspect @Slf4j public class AspConfig { @Pointcut("execution(* com..AFeignService.get(..))") public void pointcue(){ } @Around("pointcue()") public Object overrideReturnValue(ProceedingJoinPoint joinPoint) throws Throwable { log.info("AspConfig.overrideReturnValue execute ................."); //joinPoint.proceed(); 不調(diào)用原來(lái)方法 ErpReturnDTO dto = new ErpReturnDTO(); dto.setStatus(200); dto.setSuccess(true); dto.setMessage("success"); dto.setData(new ArrayList<>()); Result<ErpReturnDTO> result = Result.succeed(dto); return result; } }
添加切面配置類(lèi),這是用于測(cè)試用途的代碼,不能寫(xiě)在src/代碼上,而是使用ImportBeanDefinitionRegistrar,在測(cè)試中引用進(jìn)來(lái)。 ImportBeanDefinitionRegistrar: 是Spring提供接口,運(yùn)行開(kāi)發(fā)者添加自定義添加自己的配置類(lèi),Spring Boot組件擴(kuò)展就是通過(guò)這個(gè)接口來(lái)實(shí)現(xiàn)的。
public class TestAopImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(AspConfig.class); GenericBeanDefinition definition = (GenericBeanDefinition) definitionBuilder.getRawBeanDefinition(); registry.registerBeanDefinition(AspConfig.class.getName(), definition); } }
在原來(lái)的單元測(cè)試引入代理配置就可以了
@SpringBootTest @Slf4j @Import(TestAopImportBeanDefinitionRegistrar.class) class AFeignServiceTest
再次運(yùn)行測(cè)試用例,沒(méi)有異常,并且返回對(duì)象成功打印出來(lái)
{"code":0,"data":{"data":[],"message":"success","status":200,"subMessage":"success","success":true},"msg":"操作成功","success":true}
有這個(gè)代理配置,就可以在平常的開(kāi)發(fā)中,對(duì)單元測(cè)試中的依賴進(jìn)行代理覆蓋返回值,達(dá)到Mock某個(gè)方法的返回值效果了。
到此這篇關(guān)于SpringBoot利用Junit動(dòng)態(tài)代理實(shí)現(xiàn)Mock方法的文章就介紹到這了,更多相關(guān)SpringBoot Junit Mock方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中基本數(shù)據(jù)類(lèi)型與Object的關(guān)系說(shuō)明
這篇文章主要介紹了java基本數(shù)據(jù)類(lèi)型與Object的關(guān)系說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java中String、StringBuffer與StringBuilder的區(qū)別
這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別,在開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)用到String這個(gè)類(lèi)進(jìn)行操作。需要的朋友可以收藏下,方便下次瀏覽觀看2021-12-12JAVA把結(jié)果保留兩位小數(shù)的3種方法舉例
在寫(xiě)程序的時(shí)候,有時(shí)候可能需要設(shè)置小數(shù)的位數(shù),所以下面這篇文章主要給大家介紹了關(guān)于JAVA把結(jié)果保留兩位小數(shù)的3種方法,文章通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08mybatis?@InsertProvider報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了mybatis?@InsertProvider報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法
這篇文章主要介紹了Java如何通過(guò)反射獲取私有構(gòu)造、私有對(duì)象、私有字段、私有方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12