引发junit意外的Java断言错误:重新实例化静态对象后应为null
我正在为excel报表读取器方法编写一个简单的JUnit测试,这个测试是测试现有引擎对象到报表中行索引的映射。 对于这个特殊的测试,当我实际期望测试返回null时,我得到了一个结果
全局变量:
private static Engine engineOnRow7;
Map<Engine, Integer> actual= new HashMap<Engine, Integer>();
对于我的第一个断言,我使用一些参数创建了一个新的
Engine
对象,并将其放在HashMap中,所有断言都按预期传递:engineOnRow7 = new Engine(a,b,c) expected.put(engineOnRow7, 7); Integer row = actual.get(engineOnRow7); assertNotNull(row); assertTrue((int)row == 7);
然后,我用相同的参数重新实例化该对象,并在映射上执行另一个
get
操作,期望结果为null(因为它是一个“新”对象):engineOnRow7 = new Engine(a,b,c) row = actual.get(engineOnRow7); assertNull(row);
然而,上面抛出了一个AssertionError
表示row
的实际值仍然是7
我最初的想法是,映射仍然使用旧的'EngineRow7'引用,因为它是一个静态对象,这就是为什么它要查找结果7而不是null。但是我不能完全确定,所以任何帮助都将不胜感激
谢谢
附言。 这是我第一次发表堆栈溢出帖子,我意识到问题标题很模糊/我可能没有给出足够的上下文来说明我想要实现的目标,因此如果需要任何其他信息,请发表评论,我会尽力提供
# 1 楼答案
actual
aHashMap
像expected
吗? 如果是这样,那么键将取决于Engine
类的hashCode
和equals
方法。 我猜原始对象和重新实例化的Engine
对象都具有相同的哈希代码,并且是相等的。因此,它们都将指向HashMap
中的相同值