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