org.junit.platform.commons.PreconditionViolationException: Class [java8.chapter07.demo01.ForkJoinSum

这篇具有很好参考价值的文章主要介绍了org.junit.platform.commons.PreconditionViolationException: Class [java8.chapter07.demo01.ForkJoinSum。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

用分支/合并框架执行并行求和,通过Junit进行测试。

package java8.chapter07.demo01;

import org.junit.jupiter.api.Test;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

/**
 * @description
 * @date:2022/10/28 22:52
 * @author: qyl
 */
public class ForkJoinSumCalculator extends RecursiveTask<Long> { // 继 承 RecursiveTask 来创建可以用于分支/合并框架的任务
    private final long[] numbers;
    private final int start;
    private final int end;

    private static final long THRESHOLD = 10000;

    public ForkJoinSumCalculator(long[] numbers) {
        this(numbers, 0, numbers.length);
    }

    public ForkJoinSumCalculator(long[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    // 该任务负责求和的部分的大小
    @Override
    protected Long compute() {
        int length = end - start;
        if (length <= THRESHOLD) {
            return computeSequentially();               // 小于阈值 顺序执行
        }
        ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2);
        // 计算左边数组的任务放入当前线程池
        leftTask.fork();
        ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end);
        // 创建一个任务为数组的后一半求和
        Long rightResult = rightTask.compute();
        Long leftResult = leftTask.join();
        return rightResult + leftResult;
    }

    private long computeSequentially() {
        long sum = 0 ;
        for (int i = start ;i < end;i++){
            sum +=  numbers[i];
        }
        return sum;
    }

    @Test
    public void test(){
        long[] nums = LongStream.rangeClosed(1,100000).toArray();
        ForkJoinTask<Long> task = new ForkJoinSumCalculator(nums);
        System.out.println(new ForkJoinPool().invoke(task));
    }
}

出现了如下所示报错:
org.junit.platform.commons.PreconditionViolationException: Class [java8.chapter07.demo01.ForkJoinSum

问题排查

明确说了必须只能声明一个单一的构造器,这里确实我们使用了多个有参构造器,加上默认的无参构造器,其实有多个构造器的重载,不妨移动test()方法到一个新的类中。

package java8.chapter07.demo01;

import org.junit.jupiter.api.Test;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

/**
 * @description
 * @date:2022/10/28 22:52
 * @author: qyl
 */
public class ForkJoinSumCalculator extends RecursiveTask<Long> { // 继 承 RecursiveTask 来创建可以用于分支/合并框架的任务
    private final long[] numbers;
    private final int start;
    private final int end;

    private static final long THRESHOLD = 10000;

    public ForkJoinSumCalculator(long[] numbers) {
        this(numbers, 0, numbers.length);
    }

    public ForkJoinSumCalculator(long[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    // 该任务负责求和的部分的大小
    @Override
    protected Long compute() {
        int length = end - start;
        if (length <= THRESHOLD) {
            return computeSequentially();               // 小于阈值 顺序执行
        }
        ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2);
        // 计算左边数组的任务放入当前线程池
        leftTask.fork();
        ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end);
        // 创建一个任务为数组的后一半求和
        Long rightResult = rightTask.compute();
        Long leftResult = leftTask.join();
        return rightResult + leftResult;
    }

    private long computeSequentially() {
        long sum = 0 ;
        for (int i = start ;i < end;i++){
            sum +=  numbers[i];
        }
        return sum;
    }

}
class MyTest{
    @org.junit.jupiter.api.Test
    public void test(){
        long[] nums = LongStream.rangeClosed(1,100000).toArray();
        ForkJoinTask<Long> task = new ForkJoinSumCalculator(nums);
        System.out.println(new ForkJoinPool().invoke(task));
    }
}

再次运行,结果如下:
org.junit.platform.commons.PreconditionViolationException: Class [java8.chapter07.demo01.ForkJoinSum

总结

通过Junit进行测试的时候,包含了@Test标注的测试方法所在的类不能包含多个构造器的重载,只能存在单一的无参构造器。文章来源地址https://www.toymoban.com/news/detail-505872.html

到了这里,关于org.junit.platform.commons.PreconditionViolationException: Class [java8.chapter07.demo01.ForkJoinSum的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • org.junit.jupiter.api.Test和org.junit.Test区别

    添加junit4依赖 执行测试时报错 然后换成 执行成功 那么这是为什么呢? 打开junit4的源码 可以得知: 测试注释告诉JUnit,它所附加的公共void方法可以作为测试用例运行。 要运行该方法,JUnit首先构造一个新的类实例,然后调用带注释的方法。 测试引发的任何异常都将被JUni

    2024年02月11日
    浏览(35)
  • org.apache.commons.lang3工具类使用

    首先需要引入依赖 常用方法如下:

    2024年02月12日
    浏览(56)
  • NoClassDefFoundError: org/elasticsearch/common/xcontent/DeprecationHandler问题

    在学习es的 RestHighLevelClient 时, 在项目中的common模块中引入es依赖 写好RestHighLevelClient的config配置类后,启动验证有没有将RestHighLevelClient注入进项目时,报错如标题所示,上网搜索,说是可能依赖中有低版本的elasticsearch存在。 检查外部依赖果然是。elasticsearch-rest-high-level-cl

    2024年02月04日
    浏览(37)
  • Junit单元测试 org.junit.jupiter.api.extension.ParameterResolutionException异常处理

    想根据Id查询信息,在Junit单元测中报错 @Test 单元测试方法中不允许添加参数 将 (Integer id) 删除即可,但这样必须手动添加调用方法中的id,并且只能测试查询单条数据,比如我要查询id=1的数据,就只能手动在括号里添加1 如果我要查询多条数据,自定义参数的话,可以使用参

    2023年04月22日
    浏览(37)
  • Maven导入org.apache.commons.lang3.StringUtils

    Maven导入org.apache.commons.lang3.StringUtils Maven导入org.apache.commons.lang3.StringUtils pom.xml中加入以下内容

    2024年02月04日
    浏览(57)
  • java:程序包org.junit不存在详解

    运行@Test时,报错java:程序包org.junit不存在。 解决方法:点击File---Project Structure--- 点击右上方的 + 号 ,进入JARs or directories 打开IDEA安装位置,进入lib目录,选取hamcrst-core-1.3.jar和junit-4.12.jar 两个jar文件(注意这里的路径是自己IDEA的安装路径)    勾选hamcrst-core-1.3.jar和junit-4.

    2024年02月16日
    浏览(34)
  • java.lang.NoClassDefFoundError: org/elasticsearch/common/xcontent/ToXContentObject

    1.初学整合ElasticSearch,创建好Configuration测试报错。 2.解决方法         在pom文件中指定es版本,需和引入的RestHighLevelClient版本一致 3.更新Maven,完美解决

    2024年02月09日
    浏览(56)
  • IDEA常见错误:程序包org.apache.commons.xxx不存在

    具体错误: Could not transfer artifact org.apache.commons:commons-text:pom:1.1 from/to Nexus(Repository - Nexus Repository Manager) 原因: Nexus镜像源无法找到该程序包地址, 可更改镜像源及配置解决。 不修改会提示认证失败  

    2024年02月11日
    浏览(92)
  • Maven - 程序包 org.junit 不存在解决方案

    报错信息 关键信息:程序包 org.junit 不存在 原因分析 在 mvn clean install 时,弹出该错误,可能的情况 1、junit 版本处于 3.x(默认的版本为3.8.1,修改为4.x,因为3.x使用的为编程的方式,4.x为注解的形式) 2、scope 处于 test 解决方案 修改 scope 为 compile 或者直接删除,以及升级版

    2024年02月12日
    浏览(29)
  • flink连接kafka报:org.apache.kafka.common.errors.TimeoutException

    测试flink1.12.7 连接kafka: 执行报错如下: 经排除,找到文章:flink连接kafka报:org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic_未来的资深Java架构师的博客-CSDN博客 因为工程中log4j默认等级是error,所以,先配置resource/log4j.properties,日志等级改成info: 再运行

    2024年02月06日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包