本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.

文章目录

  • 简介
  • 方式一: 阻塞测试用例线程
  • 方式二: 分离异步线程与业务逻辑
  • 方式三: 偷梁换柱, 替换测试用例的 Executor
    • **受 CSDN 博客站限制, 此章节的完整内容点已迁移至 [DevDengChao 的博客 https://blog.dengchao.fun](https://blog.dengchao.fun) 的 [how-to-unit-test-async-method-in-spring](https://blog.dengchao.fun/2022/08/11/how-to-unit-test-async-method-in-spring/#%E6%96%B9%E5%BC%8F%E4%B8%89-%E5%81%B7%E6%A2%81%E6%8D%A2%E6%9F%B1-%E6%9B%BF%E6%8D%A2%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%9A%84-executor) 页面. 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.**
  • 审核多少有点问题, 这都不过? 咋, 不让宣传自己的 QQ 群? 中文互联网就这么封闭?
  • 告辞, 这篇文章不在 CSDN 发了也罢.

简介

近期公司里有一些业务需要服务端异步执行, 于是开发团队自热而然的使用了 Spring 自带的 @Async 注解标记了业务方法, 并使用 @EnableAsync 注解启用了异步功能, 但是编写单元测试时却遇到了由于异步引发的问题: 测试用例线程与业务线程异步, 导致无法正确的对业务进行断言.

于是我们尝试了多种不同的方式来对异步业务进行调试与测试, 最终得出了以下几种测试方式, 为了方便演示, 以如下 AsyncService 为例进行介绍:

@Service
class AsyncService { // 为了简洁省去部分访问修饰符boolean done = false;@Asyncvoid myAsyncMethod() {Thread.sleep(1000); // 模拟 1 秒钟的业务耗时 done = true; // 模拟异步方法造成的业务影响}
}

方式一: 阻塞测试用例线程

思路非常简单: 既然测试用例线程比业务线程要提前结束, 那直接阻塞测试用例线程, 让它跑得比业务线程慢不就行了.

@SpringBootTest
class BlockUnitTestThreadAsyncServceTest {@AutowiredAsyncService service;@Testvoid test() {service.myAsyncMethod();// 强制测试用例线程等待一定时间后再进行断言Thread.sleep(2000); assertTrue(service.done);}
}

可以看出这种方式比较笨拙

[Spring] [最佳实践] 如何对 @Async 标记的异步方法进行单元测试相关推荐

  1. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  2. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  3. Spring Validation最佳实践

    Spring Validation最佳实践 前言 一.简单使用 二.使用步骤 1.引入依赖 2.requestBody 参数校验 (1)在 DTO对象的字段上声明约束注解: (2)在接口方法参数上声明 ...

  4. Spring Boot 3.x 最佳实践

    Spring Boot 3.x 最佳实践 Spring Boot不需要任何特定的代码布局.然而有一些最佳实践可以提供帮助. 代码结构 使用默认的包 当一个类没有包含包声明时,它会默认在"de ...

  5. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  6. Spring Boot 几条最佳实践!

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 Spring Boot是最流行的用于开发微服务的Java ...

  7. Spring Boot 最流行的 16 条最佳实践!

    点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达! 来源:http://t.cn/EJWZNra Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016 ...

  8. 两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

    转载自   两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践 Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016年以来我在专业开发中使用Sp ...

  9. Spring Boot 最佳实践

    转载自  Spring Boot 最佳实践 Spring Boot是用于开发微服务的最流行的Java框架.在本文中,我将与您分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践 ...

最新文章

  1. 人类首次商业太空行走敲定!马斯克SpaceX宣布新一轮太空旅行计划,美国富豪成回头客...
  2. Shell脚本之一 Shell脚本简介
  3. 王之泰201771010131《面向对象程序设计(java)》第九周学习总结
  4. mysql 开发基础系列22 SQL Model(带迁移事项)
  5. NET问答:null != variable 和 variable != null 到底有什么区别?
  6. 路径.git下的文件
  7. 90后就敢当扫地僧!不服?4月24号来闯龙门阵!
  8. 萤石云好友分享的监控怎么看_助力开学季丨萤石云APP新增群组分享功能、扩容优惠套餐!...
  9. 【Python实例第35讲】高斯过程分类:Iris数据集
  10. 关于线性模型你可能还不知道的二三事
  11. Ubuntu 14.04下360/小米/百度等随身Wifi驱动安装方法
  12. 银行专业术语解释说明 超级详细
  13. 戴尔服务器u盘装系统看不见磁盘,戴尔电脑u盘装系统找不到硬盘怎么解决
  14. 在python中如何读写txt文本文档
  15. 使用cpolar内网穿透搭建远程监控
  16. 多层感知器(Muti-Layer Perception ,MLP)
  17. CUDA编程之环境配置
  18. 查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
  19. CSCD+北大核心《计算机工程与应用》期刊投稿经验,2022年10月最新
  20. 一张图让你了解软件开发流程

热门文章

  1. Jmeter写入测试结果到excel文件中---jxl.jar
  2. 树莓派HDMI无输出
  3. 金融科技大数据产品推荐:荣之联·风报—人工智能企业情报分析系统
  4. 后台服务启动前台Service(跨进程)
  5. armabi armabi-v7a armabi-v8a 区别
  6. 计算机毕业设计django基于python学校在线打印系统
  7. 深度学习:权重衰减(weight decay)与学习率衰减(learning rate decay)
  8. 关闭centos7下哔哔声
  9. Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三
  10. 【Nature 子刊】I型HLA基因中和癌症相关的体细胞突变--转载