使用HashTable对assertNull行为感到困惑

时间:2013-08-09 09:44:46

标签: java junit

在一些JUnit修复期间,我找到了这行代码:

Assert.assertNull(lAllEntryById.put(lEntry.getId(), lEntry));

如果我检查操作lAllEntryById.put(lEntry.getId(), lEntry),结果始终为null,但assertNull仍然失败。

当我将代码更改为:

 Entry lEntry = lAllEntryById.put(lEntry.getId(), lEntry);
 Assert.assertNull(lEntry);

一切正常。

我有点困惑。你能告诉我为什么我用上面的代码行得到两个不同的结果吗?

很多......

2 个答案:

答案 0 :(得分:2)

这些行在断言中具有相同的结果:

Assert.assertNull(lAllEntryById.put(lEntry.getId(), lEntry));

这个

Entry lEntry = lAllEntryById.put(lEntry.getId(), lEntry);
Assert.assertNull(lEntry);

问题可能是由以下原因造成的:

  1. 在添加新元素之前忘记清除表格(然后put返回旧对象)

  2. 您可以在另一个

  3. 之后依次执行1个语句

    为避免这种情况,我建议您进行此项实验:

    lAllEntryById = new HashTable<EntryId, Entry>(); // ensure nothing effects it
    Assert.assertNull(lAllEntryById.put(lEntry.getId(), lEntry));
    

答案 1 :(得分:0)

http://docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html#put%28K,%20V%29

  

返回:       此哈希表中指定键的先前值,如果没有一个

,则返回null

确认您之前没有使用相同的密钥在哈希映射中插入值。

尝试:

Assert.assertFalse(lAllEntryById.contains(lEntry.getId());

在断言之前。