如何测试链表中的删除元素?

时间:2017-08-28 14:47:54

标签: java junit linked-list

我在下面有一个链接列表:

enter image description here

如果我想使用此代码删除元素:

 int a = list1.remove(0);

那么我应该包含哪些验证码以确保此操作正常运行?

谢谢你,希望很快能收到你的答复。

4 个答案:

答案 0 :(得分:2)

说明

方法LinkedList#remove(int) 移除 给定位置的元素(在您的案例索引0中,所以第一个元素),这里是它的documentation

删除后,所有其他元素移到前面(索引1变为索引0,依此类推)。作为备注:由于LinkedList的性质,这不需要额外费用。

测试

测试正确性有几种可能性(例如,对于JUnit测试):

  • 测试方法是否删除了某些内容
  • 测试方法是否删除了正确的元素(第一个)
  • 测试所有其他元素是否移到前面(索引已更改)
  • 测试方法是否返回已删除的元素(根据其文档)
  • 测试方法是否正确处理空列表(抛出异常)
  • 测试方法是否正确删除了null
  • 元素

实施例

以下是所有提到的案例的一些实现:

@Test
public void testSizeChange() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertEquals(5, list.size());
    list.remove(0);
    Assert.assertEquals(4, list.size());
}

@Test
public void testRemovedCorrectElement() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertTrue(list.contains(1));
    list.remove(0);
    Assert.assertFalse(list.contains(1));
}

@Test
public void testElementsMoved() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    list.remove(0);

    Iterator<Integer> iter = list.iterator();
    for (int i = 2; i <= 5; i++) {
        Assert.assertTrue(iter.hasNext());
        Assert.assertEquals(i, iter.next());
    }
    Assert.assertFalse(iter.hasNext());
}

@Test
public void testReturnRemovedValue() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));

    Assert.assertEquals(1, list.remove(0));
}

@Test(expected = IndexOutOfBoundsException.class)
public void testHandleEmpty() {
    LinkedList<Integer> list = new LinkedList<>();
    list.remove(0);
}

@Test
public void testRemoveNull() {
    LinkedList<Integer> list = new LinkedList<>(Arrays.asList(null, 2, 3, 4, 5));

    Assert.assertNull(list.remove(0));
}

请注意,如果您的LinkedList不是java.util.LinkedList,而是自己的实施,则可能需要根据您的文档和需要稍微修改后面的示例。

答案 1 :(得分:2)

您应该在以下所有情况下测试您的操作:

  1. 验证a是否有价值。
  2. 检查get(-1)以确保导致索引超出绑定异常。
  3. 检查get(0)返回值是21。
  4. 调整列表大小以查看。
  5. 希望它会有所帮助。

答案 2 :(得分:0)

您只需在链接列表上调用size方法即可对其进行测试。然后对链表的预期大小进行断言。

assertEquals(EXPECTED_SIZE, list1.size()) 

预期大小将是一个int值,它比初始大小小1。

要断言是否删除了实际值,您可以在包含

上断言
assertFalse(list1.contains(65))

这里65是已删除的实际值。

答案 3 :(得分:0)

其他答案都是正确的 - 但仍然可以创建一个错误的列表实现,通过所有这些特定的测试 - 但包含一些模糊的错误。

这是基于QuickCheck想法的测试框架具有某些优点的场景。而不是手动编写各种测试用例 - 而是指定规则/合同,对于QuickCheck的操作必须为true。然后框架创建随机测试 - 当它发现违反规则的内容时,它甚至会减少对最小值的输入。需要显示问题。

我不是说QuickCheck是&#34;更好&#34;解决方案 - 但它绝对是其他答案指向您的测试类型的良好伴侣。