SpringBoot利用Junit动态代理实现Mock方法

 更新时间:2024年04月09日 17:21:40   作者:神易峰  
说到Spring Boot 单元测试主要有两个主流集成分别是Mockito,Junit,这个各有特点,在实际开发中,我想要的测试框架应该是这个框架集成者,本文给大家介绍了SpringBoot利用Junit动态代理实现Mock方法,需要的朋友可以参考下

说到Spring Boot 单元测试主要有两个主流集成分别是Mockito,Junit,这个各有特点,在实际开发中,我想要的测试框架应该是这个框架集成者。要有Junit能够运行某一个单元用例,完整的项目环境,又需要Mockito能对某一个依赖进行注入,指定返回值内容。可惜实际中这两个框架根本不能同时运行的。突然想到可以通过AOP的环绕通知来实现Mock注入功能,覆盖某一个方法返回值。 现在有一个Feign接口AService,实际情况我们环境根本就没有这个服务,调用这个方法一定会报错的。通过代理技术的环绕通知覆盖返回值,能让方法正常调用。具体代码实现如下

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));
    }
}

执行测试用例,一定会出错,缺少代理方法 在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();  不调用原来方法
        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提供接口,运行开发者添加自定义添加自己的配置类,Spring Boot组件扩展就是通过这个接口来实现的。

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}

有这个代理配置,就可以在平常的开发中,对单元测试中的依赖进行代理覆盖返回值,达到Mock某个方法的返回值效果了。

到此这篇关于SpringBoot利用Junit动态代理实现Mock方法的文章就介绍到这了,更多相关SpringBoot Junit Mock方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java超详细讲解WebMvcConfigurer拦截器

    Java超详细讲解WebMvcConfigurer拦截器

    这篇文章将用实例来和大家介绍一下WebMvcConfigurer拦截器。文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-06-06
  • SpringBoot mybatis-plus使用json字段实战指南

    SpringBoot mybatis-plus使用json字段实战指南

    在现代应用开发中经常会使用JSON格式存储和传输数据,为了便捷地处理数据库中的JSON字段,MyBatis-Plus提供了强大的JSON处理器,这篇文章主要给大家介绍了关于SpringBoot mybatis-plus使用json字段的相关资料,需要的朋友可以参考下
    2024-01-01
  • java实现多人聊天室可视化

    java实现多人聊天室可视化

    这篇文章主要为大家详细介绍了java实现多人聊天室可视化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java管理对象方法总结

    Java管理对象方法总结

    在本篇文章中小编给大家分享了关于Java管理对象方法以及相关代码知识点,需要的朋友们跟着学习下。
    2019-05-05
  • Spring框架学习之AOP详解

    Spring框架学习之AOP详解

    这篇文章主要介绍了Spring框架学习之AOP详解,文中有非常详细的代码示例,对正在学习Spring框架的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-05-05
  • Java多线程synchronized同步方法详解

    Java多线程synchronized同步方法详解

    这篇文章主要介绍了Java多线程synchronized同步方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 深入浅析SPI机制在JDK与Spring Boot中的应用

    深入浅析SPI机制在JDK与Spring Boot中的应用

    SPI是一种使软件框架或库更加模块化、可扩展和可维护的有效方法。通过遵循“开闭原则”, SPI 确保了系统的稳定性和灵活性,从而满足了不断变化的业务需求,这篇文章主要介绍了SPI机制在JDK与Spring Boot中的应用,需要的朋友可以参考下
    2023-09-09
  • 详解RSA加密算法的原理与Java实现

    详解RSA加密算法的原理与Java实现

    这篇文章主要和大家分享非对称加密中的一种算法,那就是 RSA 加密算法。本文介绍了RSA算法的原理与Java实现,感兴趣的小伙伴可以尝试一下
    2022-10-10
  • 一篇文章带你了解Maven的坐标概念以及依赖管理

    一篇文章带你了解Maven的坐标概念以及依赖管理

    这篇文章主要为大家介绍了Maven的坐标概念以及依赖管理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 浅谈静态变量、成员变量、局部变量三者的区别

    浅谈静态变量、成员变量、局部变量三者的区别

    下面小编就为大家带来一篇浅谈静态变量、成员变量、局部变量三者的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论