首页 > 其他分享 >SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试

SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试

时间:2023-05-11 23:11:31浏览次数:34  
标签:SpringBoot void 单元测试 result currentProxy orderServiceUnderTest public AopContext

今天在工作中遇到一个问题,一个Service类中有一个方法,其中使用了 AopContext.currentProxy() 去访问自身的函数,例如

int result = ((OrderServiceImpl) AopContext.currentProxy()).save();

单元测试方法如下:

@InjectMocks
private OrderServiceImpl orderServiceUnderTest;

@Test
@DisplayName("AopContext测试")
public void test() {
    int result = orderServiceUnderTest.insertDemo();
    assertThat(result).isEqualTo(1);
}

但是在运行测试的时候出现了 java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available, and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.

这时候需要将AopContext的静态方法也mock,同时,需要将被测类 OrderServiceImpl 再注入一次,注入到AopContext中。

具体代码如下:

public class SpringTestDemoApplicationTests {
    @InjectMocks
    private OrderServiceImpl orderServiceUnderTest;

    @Spy
    private orderServiceImpl orderServiceMock;

    @Mock
    private MockedStatic<AopContext> aopContextMockedStatic;

    @BeforeEach
    public void setup() {
        openMocks(this);
        aopContextMockedStatic.when(AopContext::currentProxy).thenReturn(orderServiceMock);
    }

    @Test
    @DisplayName("AopContext测试")
    public void test() {
        int result = orderServiceUnderTest.insertOrder();
        assertThat(result).isEqualTo(1);
    }

    @AfterEach
    public void tearDown() {
        aopContextMockedStatic.close();
    }
}

标签:SpringBoot,void,单元测试,result,currentProxy,orderServiceUnderTest,public,AopContext
From: https://www.cnblogs.com/ryuasuka/p/17392529.html

相关文章

  • SpringBoot3.x中spring.factories SPI 服务发现机制的改变
    目录一、基础背景二、服务发现接口spring.factories三、服务发现机制调用1.启动SpringApplication2.加载SpringApplication.run1.SpringApplication.createApplicationContext2.SpringApplication.prepareContext3.SpringApplication.refreshContext4.AutoConfigurationImportSele......
  • SpringBoot 接口并发限制(Semaphore)
    可以使用JMeter辅助测试 https://blog.csdn.net/weixin_45014379/article/details/124190381@RestController@RequestMapping({"/Test"})publicclasstest{Loggerlogger=LoggerFactory.getLogger(this.getClass());//使用Semaphore并发限制3个超过阻......
  • ssm springboot
    IOC解析Config.class得到扫描路径遍历路径下所有的java类,存在Component注解就存在专用map中(BeanDefinitionMap)根据相应的规则生成BeanName为key,类作为value核心类BeanDefinition类型作用域懒加载初始化方法销毁方法BeanDefinitionReaderBeanFactoryApplicationCon......
  • SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕
    场景在编写Controller接口时,为避免接口因为未知的异常导致返回不友好的结果和提示。如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。 可以对Controller进行全局的异常捕获和处理,一旦发生异常,则返回通用的500响应码与通用错误提示。并将异常发生的具体的......
  • springboot跨域问题解决方案
    以下内容仅供自己学习使用,侵权私聊必删。在进行前后端交互的时候,往往会遇到以下的跨域问题。那么解决这种跨域的话,可以使用以下这种方法:(引自于程序员青戈)创建config配置目录新建CorsConfig类然后把下面的内容复制进去根据自己需要修改以下就可以解决跨域问题啦importo......
  • SpringBoot整合规则引擎Drools
    目录1整合规则引擎Drools1.1前言1.2pom.xml1.3Drools配置类1.4示例Demo1.4.1添加业务Model1.4.2定义drools规则1.4.3添加Service层1.4.4添加Controller1.4.5测试1.5drools规则解析1.5.1简介1.5.2规则体语法结构1.5.3注释1.5.4Pattern模式匹配1.5.5比较操作符1.5.......
  • springboot集成springSwagger生成接口文档
    1.首先引入pom.xml依赖<!--SwaggerAPI文档--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version><exclusions><exclus......
  • java基于springboot+vue的房屋租赁租房系统、租房管理系统,附源码+数据库,免费包运行,适
    1、项目介绍java基于springboot+vue的房屋租赁租房系统、租房管理系统,分为管理员和用户。用户的功能有:登录、注册、房屋信息、交流论坛、房屋咨询、在线客服、个人中心、我的收藏、我的发布、预约看房管理、在线签约管理、租赁评价管理、管理员的功能有:登录、个人中心、用户管......
  • SpringBoot上传图片到resource下
    推荐博客:https://blog.csdn.net/weixin_52065369/article/details/120412307这样上传到resource下的图片需要重启编译后才能访问,需要配置以下才能访问的到,通常不采用这样的方式https://blog.csdn.net/qq_41604890/article/details/114553632上传图片到本机......
  • springboot自动装配过程
    一、首先要知道springboot的启动类然后知道启动类有一个重要的注解:@SpringBootApplication然后跟踪查看,它是由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan注解组成的@SpringBootConfiguration作用是声明当前类是一个组件@ComponentScan作用是扫描启......