【问题标题】:Confused about assertNull behaviour with HashTable对 HashTable 的 assertNull 行为感到困惑
【发布时间】:2013-08-09 19:03:57
【问题描述】:

在一些 JUnit 修复过程中,我发现了这行代码:

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

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

当我将代码更改为:

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

一切正常。

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

非常感谢...

【问题讨论】:

  • 检查是在什么情况下进行的?剩下的测试用例是什么?
  • 上下文是什么意思?我用 ctrl+alt+i Eclipse IDE 检查它。
  • 这就是我的意思。这种行为很奇怪,所有关于调用的信息都很有用。
  • HashTable是否被多个线程访问?
  • 您能否将assertNull 悬停在复合语句中并验证签名是什么?如果将值转换为 (Entry) 会发生什么?

标签: java junit


【解决方案1】:

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

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

还有这个

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

问题可能是由以下原因引起的:

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

  2. 你可以依次执行一条语句

为了避免这种情况,我建议做这个实验:

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

【讨论】:

  • 对不起,我不明白。正如您所描述的, lAllEntryById.put 的结果在这两种情况下都是空的。但第一个 assertNull 为假,第二个为真。 WTF???
  • 我已经添加了实验来避免提到的问题
【解决方案2】:

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

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

验证您之前没有在哈希图中插入具有相同键的值。

尝试做:

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

在你的断言之前。

【讨论】:

  • OP 似乎已经阅读了 Javadoc。他问的是一个奇怪的情况,将返回值分成自己的变量会改变行为。
  • 我的意思是在assert之前插入了一个值是很容易忘记的,所以问题是这个值之前是如何插入的,我们需要更多的代码。
  • 该键没有任何价值。我不明白为什么我调用 assertNull 的两种方式会给我不同的结果......
  • 不是一个接一个地做 2 断言吗?您如何检查密钥是否没有价值?如果您没有尝试,您应该在断言之前打印该值以确保。
  • 我编辑了我的答案,检查 hashtable 的 contains 方法返回了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2019-04-14
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多