首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造java.time.temporal.ValueRange错误

构造java.time.temporal.ValueRange错误
EN

Stack Overflow用户
提问于 2020-02-19 13:29:54
回答 1查看 100关注 0票数 4

我正在处理项目中的一些时间问题,在实现单元测试时,我不确定是否发现了错误,或者只是误解了文档。用于ValueRange.of(龙敏,龙maxSmallest,龙maxLargest)状态的javadocs:

代码语言:javascript
复制
 * @return the ValueRange for min, smallest max, largest max, not null
 * @throws IllegalArgumentException if
 *     the minimum is greater than the smallest maximum,
 *  or the smallest maximum is greater than the largest maximum

我读取的方式是,如果传递给min的值大于maxSmallest的值,它应该会抛出一个异常。但是,下列代码有效:

ValueRange vr = ValueRange.of(5, 2, 10);

我认为这应该会失败。min的值大于最小最大值的值,但不会引发异常。此外,在打印结果ValueRange时,它看起来非常奇怪:5- 2/10。

这是个虫子吗?还是我只是不理解javadocs?

EN

回答 1

Stack Overflow用户

发布于 2020-02-19 17:54:50

它是一个bug JDK-8239520,在JDK 15 建造12中是固定

我为不同的值范围创建了基于ValueRange.of() API的单元测试:

代码语言:javascript
复制
package org.mycompany.mavenproject1;

import java.time.temporal.ValueRange;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class ValueRangeTest {

    @ParameterizedTest
    @CsvSource({
        "5, 2" // the minimum is greater than the maximum
    })
    public void testFixedValueRange(long min, long max) {
        Executable when = () -> ValueRange.of(min, max);

        assertThrows(IllegalArgumentException.class, when,
                () -> "min: " + min + ", max: " + max);
    }

    @ParameterizedTest
    @CsvSource({
        "5, 2, 10", // the minimum is greater than the smallest maximum - THIS FAILS!
        "2, 10, 2" // the smallest maximum is greater than the largest maximum
    })
    public void testVariableValueRange(long min, long maxSmallest, long maxLargest) {
        Executable when = () -> ValueRange.of(min, maxSmallest, maxLargest);

        assertThrows(IllegalArgumentException.class, when,
                () -> "min: " + min + ", maxSmallest: " + maxSmallest + ", maxLargest: " + maxLargest);
    }

    @ParameterizedTest
    @CsvSource({
        "5, 1, 2, 10", // the smallest minimum is greater than the smallest maximum
        "1, 2, 10, 2", // the smallest maximum is greater than the largest maximum
        "1, 11, 2, 10" // the largest minimum is greater than the largest maximum
    })
    public void testFullyVariableValueRange(long minSmallest, long minLargest, long maxSmallest, long maxLargest) {
        Executable when = () -> ValueRange.of(minSmallest, minLargest, maxSmallest, maxLargest);

        assertThrows(IllegalArgumentException.class, when,
                () -> "minSmallest: " + minSmallest + ", minLargest: " + minLargest + ", maxSmallest: " + maxSmallest + ", maxLargest: " + maxLargest);
    }

}

所有方案只通过一个- if the minimum is greater than the smallest maximum

代码语言:javascript
复制
Tests run: 6, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.087 s <<< FAILURE! - in org.mycompany.mavenproject1.ValueRangeTest
testVariableValueRange{long, long, long}[1]  Time elapsed: 0.034 s  <<< FAILURE!
org.opentest4j.AssertionFailedError: min: 5, maxSmallest: 2, maxLargest: 10 ==> Expected java.lang.IllegalArgumentException to be thrown, but nothing was thrown.
    at org.mycompany.mavenproject1.ValueRangeTest.testVariableValueRange(ValueRangeTest.java:30)

这让我相信这是ValueRange中的一个bug。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60301507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档