Junit测试多线程无法得到结果的问题解决

class Main {
    public static void main(String[] args) {
        String trxFileDir = args[0];
        String targetDir = args[1];
        boolean isDecode = Boolean.parseBoolean(args[2]);
        ParseMojo parseMojo = new ParseMojo(trxFileDir,targetDir,isDecode);
        parseMojo.execute();
    }
}
    @Test
    public void executeEncode() {
        String trxFileDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\inputFile\\";
        String targetDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\outputFile\\";
        boolean isEncode = true;
        ParseMojo parser = new ParseMojo(trxFileDir, targetDir, isEncode);
        parser.execute();
    }

解析工具支持多线程,核心代码如下

		 Arrays.stream(trxFiles).forEach(trx -> PARSE_POOL.execute(() -> {
                    convertToBinaryFile(trx);
            }));

猜测可能原因

首先当前问题和业务逻辑无关,初步怀疑是多线程和UT的问题,可能Junit进行测试的时候,主线程结束会导致子线程也终止。

问题排查

添加打印,查看文件的中断处

打印结果如下:

很明显,主进程结束退出的时候,子进程还没有执行完成,且每次执行到的位置不一致

问题原因

分析Junit源码

    public static void main(String args[]) {
        TestRunner aTestRunner = new TestRunner();
        try {
            TestResult r = aTestRunner.start(args);
            if (!r.wasSuccessful()) {
                System.exit(FAILURE_EXIT);
            }
            System.exit(SUCCESS_EXIT);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.exit(EXCEPTION_EXIT);
        }
    }

这是Junit运行的入口,我们可以发现,不管Junit测试是否成功,都会调用System.exit(),而这个方法会用来结束当前正在运行的java虚拟机。当status=0时表示正常结束,status=1表示异常退出(强制退出,程序未执行完也会退出)。JVM都关闭了,子线程还靠什么运行呢?所以这就是问题所在。

总结

在需要被测试类为多线程执行任务的时候,注意不要直接使用Junit单元测试,可能由于系统退出,导致任务异常中断。

注意要使并发工具类如 CountDownLatch、thread.join()保证任务中的线程全部执行完毕。

以上就是Junit测试多线程无法得到结果的问题解决的详细内容,更多关于Junit测试多线程无法得到结果的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何在Maven项目中运行JUnit5测试用例实现

    本文演示了如何如何编写JUnit 5测试用例,在Maven项目中运行JUnit 5测试用例. 编写JUnit 5测试用例 如果你是Java开发者,那么对于JUnit应该就不陌生.JUnit是Java单元测试的基础工具. JUnit目前最新的版本是JUnit 5.x,但广大的Java开发者估计还停留在JUnit 4.x,因此有必要演示下如何编写JUnit 5测试用例. 引入JUnit 5依赖 相比较JUnit 4而言,JUnit 5一个比较大的改变是JUnit 5拥有与JUnit 4不同的全新的A

  • 教你用IDEA配置JUnit并进行单元测试

    一.JUnit 是什么? JUnit 是一个 Java 语言的回归测试框架(regression testing framework),由 Kent Beck 和 Erich Gamma 建立. Junit 测试也是程序员测试,即所谓的白盒测试,它需要程序员知道被测试的代码如何完成功能,以及完成什么样的功能. 二.IDEA 的 JUnit 配置 (1)添加junit的依赖jar包      junit-4.12.jar.hamcrest-core-1.3.jar Maven项目pom配置: Ma

  • Junit springboot打印测试方法信息

    有时候需要使用junit做测试.方便日后参考. 目前流行的springboot 的junit测试,在很多时候需要使用.当前执行的方法是什么,我们只需要引入用注解方法就可以了. pom.xml引入依赖jar包 <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId&

  • idea +junit单元测试获取不到bean注入的解决方式

    如图,刚开始报错获取不到bean因为配置文件 1.原因一: *.properties等没有值,还是用${变量的}.获取不到,于是把所有值复制到properties文件里. 2.原因二: springmvc.xml 没有某些静态资源获取报错,把src的resources下的springmvc.xml复制到test目录的resources下,删除静态资源引用. 3.原因三: 可去掉log4j配置. 补充知识:IDEA的junit单元测试Scanner输入无效 在idea的junit单元测试中用Sca

  • Spring Junit单元测试加载配置文件失败问题

    JUnit是Java中最有名的单元测试框架,用于编写和运行可重复的测试,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. 使用SpringJunit单元测试,通过@ContextConfiguration加载配置文件后,只会在src/test/resources目录下寻找配置文件,不会加载src/main/resources中的. 这样就导致了项目可以正常启动,但是单元测试时会提示找不到注入的类. 可以通过pom.xml配置来解决该问题

  • SpringMVC框架整合Junit进行单元测试(案例详解)

    本文主要介绍在SpringMVC框架整合Junit框架进行单元测试.闲话少述,让我们直入主题. 系统环境 软件 版本 spring-webmvc 4.3.6.RELEASE spring-test 4.3.6.RELEASE junit 4.12 引入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</ver

  • Java Junit单元测试实例详解

    测试分类 黑盒测试: 不需要写代码, 给输入值, 看程序是否能够输出期望的值 白盒测试: 需要写代码, 关注程序具体的执行流程 Junit 是白盒测试的一种 1.定义一个测试类 (测试用例) 包名: xxx.xxx.test 测试类名: 被测试的类型 + Test 2.定义测试方法: 可以单独运行 方法名: test + 测试的方法名 返回值: void 参数列表: 空参 3.给方法加 @Test 注解 (需要导入 Junit 环境依赖) 4.判定结果: 红色: 失败, 绿色: 成功 一般使用断

  • Springboot使用Junit测试没有插入数据的原因

    从写Junit开始笔者就有一个疑问,为什么执行插入测试方法成功了但是数据库里却没有对应数据,那怎么测试的呢?今天查阅了资料找到了原因 1.Junit测试原理 springboot中使用junit编写单元测试默认是事物回滚的,这样测试的脏数据不影响数据库,即实际上是执行了对应的插入操作,但是完成操作后执行了事务回滚操作,从而数据库中没有对应数据. 2.关闭自动事务回滚 在对应的测试方法上添加@Rollback(false)关闭回滚. 补充知识:Spring Boot Junit无法执行问题汇总 S

  • Springboot集成JUnit5优雅进行单元测试的示例

    为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余. JUnit5易扩展,包容性强,可以接入其他的测试引擎. 功能更强大提供了新的断言机制.参数化测试.重复性测试等新功能. ps:开发人员为什么还要测试,单测写这么规范有必要吗?其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有

  • SpringBoot 单元测试JUnit的使用详解

    一.简介 JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用于白盒测试和回归测试. 白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人 员是公开的: 回归测试:软件或环境修复或更正后的再测试: 单元测试:最小粒度的测试,以测试某个功能或代码块.一般由程序员来做,因为它需要知道内部程序设计和编码的细节: 二.JUnit使用 1.pom.xml中添加JUnit依赖.

  • Spring Boot通过Junit实现单元测试过程解析

    这篇文章主要介绍了Spring Boot通过Junit实现单元测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.需要在pom.xml中引入spring-boot-starter-test <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifa

随机推荐