JUnit测试失败但显示相同的预期和实际结果

时间:2014-02-11 11:05:00

标签: java unit-testing intellij-idea junit4

所以,我甚至不知道从哪里开始。整个惨败都是在八个多小时前开始的,杰里在一个接一个的问题上走出了困境。现在,这个: Junit test failing, with passing results 点击“点击查看差异”后,它会变得更好: enter image description here

我有:
- 无效的缓存并重新启动IntelliJ
- 尝试在Double[] numSet = {23.0};的位置运行,然后将预期结果设置为numSet而不是"[23.0]"。没有骰子。
- 有关添加增量的答案无效:JUnit test fails even if the expected result is correct

我觉得值得注意的是,从主类调用方法时,第48行出现的错误并没有显示出来,所以我不知道那可能是什么。

任何帮助将不胜感激。

以下是要测试的方法的代码。几乎忘了它:

public List<Object> trimNumberSet(Double[] numSet) {
    List<Object> trimmedNumberSet = new ArrayList<>();

    for (int i = 0; i < numSet.length; i++) {
        if (numSet[i] != null) {
            trimmedNumberSet.add(numSet[i]);
        }
    }
    return trimmedNumberSet;
}

3 个答案:

答案 0 :(得分:17)

您正在比较StringList<Object>

所以你正在使用方法assertEquals(Object expected, Object actual);

显然,String不等于List<Object>因此失败。

但由于列表的String表示与您编写的相同,因此它会在控制台中隐藏结果,因为它使用此表示向您显示此测试的结果。

所以你应该比较两者的字符串表示:

assertEquals("[23.0]", setSorteer.trimNumberSet(numSet).toString());

更好的想法是直接比较两个列表,而不是将您的测试基于字符串表示,因为它们将来可能会更改,并且您的测试将失败:

assertEquals(Arrays.asList(23.0), setSorteer.trimNumberSet(numSet));

<小时/> 您还没有在方法中返回List<Double>的任何原因吗?

public List<Double> trimNumberSet(Double[] numSet) {
    List<Double> trimmedNumberSet = new ArrayList<>();
    ...
    return trimmedNumberSet;
}

答案 1 :(得分:2)

正如ZouZou所说,您正在比较不同的数据类型。 numSet是一个双打数组,而trimNumberSet的结果是双打列表。

另外,请注意:将List中的Double值与String进行比较时,我强烈建议您使用数字格式化程序来确保缩放符合您的预期(例如,“23.0”而不是“23.000001”)。 Double值的内部表示通常会导致你得到的结果不是你以前所做的那样。

答案 2 :(得分:1)

我认为您的问题遇到了数据类型。即使数据是“相同的”,测试也可能是比较字符串与整数(或者正在使用的数字实现)。在其他情况下会发生此错误...

尝试将左侧转换为setSorter.trimNumberSet检索或转换setSorter.trimNumberSet的返回对象为assertEquals中的字符串的相同数据类型。

希望有所帮助!