assertEquals抛出NullPointerException,但equals方法不抛出

时间:2017-04-06 19:58:10

标签: junit nullpointerexception

我有两个列表对象,想要检查每个列表对象的第一项是否相等。但是,我在这一行得到一个NullPointerException:

assertEquals(instance.getPlane(0), planes.get(0));

这是整个堆栈跟踪:

  

测试用例:testGetPlane(mypackage.PlaneTest):导致出错ER   空
  显示java.lang.NullPointerException
    在mypackage.PlaneTest.testGetPlane(PlaneTest.java:60)

(第60行是断言。)

这两个对象都不为空。我有一个单独的问题让调试器工作,所以我将这些打印输出添加到我的测试用例中:

System.err.println("equals? " + instance.getPlane(0).equals(planes.get(0)));
System.err.println("equals? " + planes.get(0).equals(instance.getPlane(0)));

然而,执行这些行没有丢失任何错误!

我已经清理并构建了项目并重新启动了Netbeans,但仍有此问题。

JUnit只调用expected.equals(actual),这应该与我的打印输出完全相同,不会抛出错误,对吧?为什么assertEquals会抛出NullPointerException,但equals会抛出相同的对象?

1 个答案:

答案 0 :(得分:1)

(当我发现这个问题时,我正准备单独发布这个问题,但是因为这是一个痛苦,所以我发布了它,希望这可能有助于其他人。我没有找到任何其他问题。溶液。)

该错误实际上是由JUnit在尝试撰写错误消息时引起的。

the format function中,有以下几行:

String expectedString = String.valueOf(expected);
String actualString = String.valueOf(actual);
if (expectedString.equals(actualString)) { ... }
如果obj.toString()不为空,则

String.valueOf(Object obj)会返回obj

我的对象的toString方法只返回了一个" name"字段,从未在测试中设置。因此,该对象不为null,但该函数返回null。当JUnit尝试调用expectedString.equals时,这会导致NullPointerException。确保toString永远不会返回null修复错误。