【问题标题】:Junit testing for hashMap with double values具有双值的 hashMap 的 Junit 测试
【发布时间】:2013-11-20 09:30:00
【问题描述】:

我正在使用 Junit 在调用方法后收到的预期和实际 HashMap 之间断言相等。代码如下所示:

Assert.assertEquals(expectedKlassToScore, klassToScore);

这里expectedKlassToScoreklassToScoreMap<MyObject, Double> 类型。 HashMap 中的一些值在小数点后长达 16 位。我假设根据运行这些测试的机器,最后几位小数可能不准确 - 由于硬件上如何实现分数的性质。

如何修改我的断言语句以启用一个准确的窗口,让测试在不同的机器上通过?

【问题讨论】:

    标签: java unit-testing testing junit


    【解决方案1】:
    public static void assertEqualsMapEpsilon(Map<Object,Double> expected, Map<Object,Double> actual, double epsilon) {
        assertEquals(expected.size(), actual.size());
        for(Map.Entry<Object,Double> value:expected.entrySet()){
            Double actualValue = actual.get(value.getKey());
            assertNotNull(actualValue);
            assertEquals(value.getValue(), actualValue, epsilon);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该为此使用BigDecimalDoubles 总是不准确的。

      【讨论】:

        【解决方案3】:

        如您所见here,Assert.assertEquals 使用 equals() 方法检查对象是否相等。我想说最简单的方法是创建一个实现 Map 并覆盖 equals 方法的类。

        【讨论】:

        • 不是测试然后测试覆盖的 equals 方法而不是 Map 本身吗?
        • 确实,在这种情况下,您会编写特定的代码来帮助测试,如果您弄错了,那么测试也会出现错误...我想如果您广泛使用它,那么你可以编写一个单元测试来测试equals方法,然后将其用于后续测试。
        【解决方案4】:

        HashMap 中的某些值在小数点后最多为 16 位。

        错了。 没有 HashMap 中的双精度值在小数点后最多为 16 位。双精度浮点数最多有 15.9 位有效十进制数字。其他一切都是幻觉。

        我假设根据运行这些测试的机器,最后几位小数可能不准确 - 由于硬件上实现分数的方式的性质。

        又错了。 Java 中所有基本类型的格式和范围都与硬件无关。

        如何修改我的断言语句以启用一个准确的窗口,让测试在不同的机器上通过?

        测试 epsilon 值内的相等性。

        【讨论】:

        • -1,但应该是-3。您的第一点 - 错误。如果足够小,双精度数很容易成为 16 位或更多十进制数字。只是前几位小数为零。您的第二点 - 错误。这取决于地图中的值是如何计算的。它们可能是某些三角函数或类似函数的结果。 Math 类中的一些方法可能会产生依赖于平台的结果 - Javadoc 说“鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用)来提供......
        • ... 更高性能的数学方法实现”。您的第三点-您不是只是在重申问题吗?“我如何获得准确度窗口?”-“使用 epsilon 进行测试值” - “什么是 epsilon 值?” - “嗯,这是一个准确度窗口”。那么 15.9 位十进制数字到底是什么样子?你要么是说它是最大值 15,要么是说它是最大值 16,或者你完全是别的意思。
        • @DavidWallace Re point 1,前导零与有效位无关。第 2 点与 OP 关于“如何在硬件上计算分数”的声明有关,这在 Java 中与机器无关。关于第 3 点,我同意 epsilon is 窗口:这就是重点。 Epsilon 定义明确:'window' 不是。
        猜你喜欢
        • 2010-09-26
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        相关资源
        最近更新 更多