CompletableFuture的单元测试Mock

这篇具有很好参考价值的文章主要介绍了CompletableFuture的单元测试Mock。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在spring项目,假设我们有一个方法

// 一个executor,和普通定义线程池一样(此处是spring自带,@Scheduled注解用到的全局线程池)
@Resource
private ThreadPoolTaskExecutor executor;

// 另一个需要装配的假定的服务
@Resource
private AnotherService anotherService;

// CompletableFuture,需要被测试的方法
public String getProductBillSummaryList(String input) {
    // 异步操作
    CompletableFuture<String> resultFuture = CompletableFuture.supplyAsync(
            () -> anotherService.someMethod(input), executor);
    
    // 等待执行完毕
    CompletableFuture.allOf(resultFuture).join();
    try {
        String s = resultFuture.get();
        System.out.println(s);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我们对这个方法单元测试,大概率就直接写成:

@Mock
private AnotherService anotherService;

@InjectMocks
private ProductTransactionSearchServiceImpl productTransactionSearchService;

@Test
public void getProductBillSummaryList() {
    Mockito.when(anotherService.someMethod(Mockito.any())).thenReturn("mockString");
    String res = productTransactionSearchService.getProductBillSummaryList("input");
    Assert.assertNull(res);
}

这样会导致Completable的线程不运行,一直阻塞在红色箭头指示的地方:

CompletableFuture的单元测试Mock,单元测试,单元测试,java,spring

等待线程执行完毕。然而线程并没有执行。

此时需要模拟并驱动异步线程的执行,因此需要这样写:

@Mock
private AnotherService anotherService;

// 需要增加这个executor的mock
@Mock
private ThreadPoolTaskExecutor executor;

@InjectMocks
private ProductTransactionSearchServiceImpl productTransactionSearchService;

@Test
public void getProductBillSummaryList() {
    Mockito.when(anotherService.someMethod(Mockito.any())).thenReturn("mockString");
    // 新增对异步线程里面Runnable方法的驱动
    Mockito.doAnswer(
        (InvocationOnMock invocation) -> {
            ((Runnable) invocation.getArguments()[0]).run();
            return null;
        }
    ).when(executor).execute(Mockito.any(Runnable.class));
    String res = productTransactionSearchService.getProductBillSummaryList("input");
    Assert.assertNull(res);
}

这样就mock了对Runnable方法的运行(就是执行run方法,只要有调用就run,不阻塞)

运行单测就可以正常通过了。

参考

java - CompletableFuture usability and unit test - Stack Overflow

 文章来源地址https://www.toymoban.com/news/detail-697596.html

到了这里,关于CompletableFuture的单元测试Mock的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(41)
  • Java的单元测试Testng和mock

    目录 单元测试重要性 TestNG TestNG官网介绍 TestNG教程 TestNG注解: 

    2024年02月07日
    浏览(31)
  • 15.Spring Boot单元测试(Service、Mock、Feign、Http Rest API)

    Spring Boot专栏目录(点击进入…) **test**表示依赖的组件仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包包含进去;spring-boot-starter-test是Spring Boot提供项目测试的工具包,内置了多种测试工具,方便我们在项目中做单元测试、集成测试。 引入spring-boot-star

    2024年02月04日
    浏览(32)
  • Java用正确的姿势写单元测试以及mock

    对于一些简单的功能或业务,我们也许可以通过前端调试、postman等接口工具、main函数调用进行测试。但这每次改动代码都要人力测试,耗费大量的人力资源且不高效,真正的项目中单元测试是必不可少的。 单元测试的三步走: 1、组装方法入参 2、执行方法 3、对方法的执行

    2024年02月13日
    浏览(26)
  • 在Java微服务项目中,如何使用Mock来进行单元测试?

    摘要: 在系统开发的过程中,单元测试是其中的一个重要环节。在Java微服务项目中,Spring框架本身就为我们提供了一套单元测试的框架SpringBootTest。如果我们在学校完成课堂作业或出于兴趣爱好自学,是可以使用Spring自带的单元测试框架进行单测的。 工作中,这种通过Spri

    2024年02月16日
    浏览(28)
  • Service层代码单元测试以及单元测试如何Mock

    接着上一篇文章:单元测试入门篇,本篇文章作为单元测试的进阶篇,主要介绍如何对Springboot Service层代码做单元测试,以及单元测试中涉及外调服务时,如何通过Mock完成测试。 现在项目都流行前后端代码分离,后端使用springboot框架,在service层编写接口代码实现逻辑。假设

    2023年04月08日
    浏览(37)
  • Testify Mock 单元测试

    Testify 提供了单测方便的断言能力,这里的断言是将对代码实际返回的断言,代码的实际输出和预期是否一致。下面是 gin-gonic/gin 代码库的单测代码,Testify 还提供了很多其他的方法: 单元测试中也会存在不稳定的代码,我们的入参虽然保持不变,但每次单测的结果可能会发

    2024年02月03日
    浏览(47)
  • 单元测试与Mock

    作者:一笑钦陈 邮箱:xianqin_chen@163.com 你好,我是一笑钦陈,《零零后程序员成长之路》作者,一线互联网 Java 工程师。很高兴你阅读我的博客,让我们共同成长进步! 提醒:在接下来您对本博客的阅读中,如果遇到一些内容、图稿、代码等中的勘误都可以通过邮件进行反

    2024年02月08日
    浏览(50)
  • 单元测试junit+mock

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通常和白盒测试联系到一起 ,如果单从概念上来讲两者是有区别的,不过我们通

    2024年02月08日
    浏览(51)
  • mock写单元测试和查数据库的单元测试

    一:mock方式 在测试类上添加注解 将需要测试的类bean添加进来,该类中的其他bean也添加进来 给被测试类中用到的参数、返回值类创建对象 创建BeforeEach和AfterEach方法,在BeforeEach方法中给参数,返回值设置值 然后在test方法中设置被测试的方法 二:可以检测dao层sql的单元测试

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包