我有两个列表对象,想要检查每个列表对象的第一项是否相等。但是,我在这一行得到一个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
会抛出相同的对象?
答案 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修复错误。