今天在工作中遇到一个问题,一个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();
}
}

如果proxy对象调用的方法是通过@Autowired注解注入的对象,可能会出现NPE。此时需要将proxy对象的注解由@Spy 改成 @Mock,并通过mockito模拟该方法的行为。而这个方法本身需要另外写一个测试方法。

SpringBoot中单元测试如何对包含AopContext.currentProxy()的方法进行测试的更多相关文章

  1. springboot中单元测试

    测试service: 测试api:

  2. TP5整合的导出Excel中没有图片和包含图片两种方法

    之前做了个项目需要导出Excel文件 ,我在网上查了许多资料,最后终于搞定了 ,现在把代码贴到下面 先导入库文件:将文件phpoffice放在根目录的vendor下.获取文件点击:链接:https:/ ...

  3. SpringBoot 中使用 Swagger2 出现 whitelabel page error 解决方法

    今天使用Swagger最新版,在pom.xml引入 <dependency> <groupId>io.springfox</groupId> <artifac ...

  4. SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存

    1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...

  5. 【快学springboot】在springboot中写单元测试[Happyjava]

    前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的J ...

  6. 【快学springboot】在springboot中写单元测试

    前言 很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码.写单元测试,也是保证代码质量的一种方式. junit单元测试 相信绝大多数的J ...

  7. 使用Visual Studio进行单元测试-Shim类中无法找到参数包含CancellationTokenSource的方法

    Shim类中无法找到参数包含CancellationTokenSource的方法,这句话有点绕口,看例子. 一.代码 public class CancellationDemo { public in ...

  8. 由浅入深学习springboot中使用redis

    很多时候,我们会在springboot中配置redis,但是就那么几个配置就配好了,没办法知道为什么,这里就详细的讲解一下 这里假设已经成功创建了一个springboot项目. redis连接工厂类 ...

  9. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  10. SpringBoot系列: 单元测试

    SpringBoot 项目单元测试也很方便, Web项目中单元测试应该覆盖:1. Service 层2. Controller 层 本文前半部分讲解是一些测试基础配置. 对于Service和Contr ...

随机推荐

  1. P2058

    这道不难的题引发了我不少思考 我第一个版本是用vector嵌套vector写成的,后来发现没必要还存储那些已经超过24h的船,完全可以删除前面的船,因此把外层vector换成了deque. 即用deq ...

  2. poj 3246 简单线段树

    线段树还真有点难写... #include <iostream> #include <cstdio> #include <cstring> #include < ...

  3. 机器学习-决策树系列-GBDT算法-集成学习-30

    目录 1. 复习 2. GBDT 3. gbdt应用于二分类: 3. gbdt应用于多类 4. 叶子节点输出值c的计算 5. GBDT的其他应用 6. GBDT+LR 代码实现 1. 复习 再开始学习 ...

  4. 小白学标准库之 log

    日常开发中,日志 log 几乎是必不可少.本文旨在介绍 log 的使用和内部实现等. 1. log 使用及实现 package main import ( "fmt" " ...

  5. RL 基础 | 如何注册自定义 gym 环境

    如何 搭建 自定义 gym 环境:https://www.cnblogs.com/moonout/p/17174833.html 如何注册自定义 gym 环境: 博客:https://zhuanlan ...

  6. spring-transaction源码分析(5)TransactionInterceptor事务拦截逻辑

    spring-tx的事务拦截逻辑在TransactionInterceptor类,本文将详细分析其实现方式. 事务拦截器TransactionInterceptor spring-tx的事务拦截逻辑在 ...

  7. 03-Shell环境变量深入

    1. 自定义系统环境变量 1.1 全局配置文件/etc/profile应用场景 当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序 ...

  8. Keep English Level-02

    change -- n 零钱 climate change -- 气候变化 exchange -- 交换,兑换(金融) exchange rate -- 汇率 move -- 感动,改变,移动 (n) ...

  9. JavaScript合并多个数组

    工作中经常会对数组进行合并,稍微总结一下常用的方法: concat JavaScript原生自带的函数,用法如下: let arr1 = [3, 5, 7]; let arr2 = [4, 78, 7 ...

  10. Linux系统下安装JDK8和Maven3.8.5

    一.下载JDK8Linux版本 官网下载太慢了,小编这里为大家下载好了: 链接:百度网盘地址 提取码:ov24 二.下载Maven maven3.8.5下载链接 三.使用xftp上传到linux上 四 ...