Java 测试场景分离 @测试 public void addlemeninEmptyList(){ 列表=新建LinkedList(); int数据=122; 添加的布尔值=list.add(数据); assertNotNull(“未添加对象”,已添加); 整数addObj=list.get(0); assertNotNull(“未找到对象”,addObj); Assert.assertEquals(“获取的值不同”,data,addObj.intValue()); }

Java 测试场景分离 @测试 public void addlemeninEmptyList(){ 列表=新建LinkedList(); int数据=122; 添加的布尔值=list.add(数据); assertNotNull(“未添加对象”,已添加); 整数addObj=list.get(0); assertNotNull(“未找到对象”,addObj); Assert.assertEquals(“获取的值不同”,data,addObj.intValue()); },java,unit-testing,junit4,Java,Unit Testing,Junit4,我已经编写了用于测试Java链接列表(用于学习JUnits)的小型JUnit测试,在上面的JUnit中,我测试了三件事 列表已修改(assertNotNull(“未添加对象”,已添加)) 能够获取第一个数据(非空) 添加数据,尝试获取它,并使用传递的数据验证它 这个Junit可能会因为三个不同的原因而失败。这是写它的正确方法吗? 请你提出更好的方法好吗?我建议你把这个方法分开。我将在一个测试方法中测试方法api的每个方面。我会这样做,因为你会从你的测试中得到关于哪些有效,哪些失败的清晰反馈。例如

我已经编写了用于测试Java链接列表(用于学习JUnits)的小型JUnit测试,在上面的JUnit中,我测试了三件事

  • 列表已修改(assertNotNull(“未添加对象”,已添加))
  • 能够获取第一个数据(非空)
  • 添加数据,尝试获取它,并使用传递的数据验证它
  • 这个Junit可能会因为三个不同的原因而失败。这是写它的正确方法吗?
    请你提出更好的方法好吗?我建议你把这个方法分开。我将在一个测试方法中测试方法api的每个方面。我会这样做,因为你会从你的测试中得到关于哪些有效,哪些失败的清晰反馈。例如

    首先看一下要测试的方法的javadoc。这是合同,测试应始终确保履行合同

    例如,javadoc说:

    将指定的元素追加到此列表的末尾(可选操作)

    支持此操作的列表可能会限制哪些元素可以添加到此列表中。特别是,一些列表将拒绝添加空元素,而其他列表将对可能添加的元素类型施加限制。列表类应在其文档中明确指定对可能添加的元素的任何限制

    如果此集合因调用而更改,则返回true

    List.add(E元素)
    javadoc还指出此方法的某些方面是由实现定义的。例如,LinkedList javadoc说

    列表和Deque接口的双链表实现。实现所有可选的列表操作,并允许所有元素(包括null)

    因此,add方法的测试应包括以下方面:

    • null
      允许添加值
    • add
      将元素追加到列表的末尾
    • 如果列表更改,则返回
      true
    因此,我的第一个测试实现如下所示

    @Test
    public void addElemenInEmptyList() {
        List<Integer> list = new LinkedList<Integer>();
        int data = 122;
        boolean added = list.add(data);
        assertNotNull("Object not added", added);
    
        Integer addObj = list.get(0);
        assertNotNull("Object not found", addObj);
        Assert.assertEquals("Fetched value is different", data, addObj.intValue());
    }
    
    但还有更多。
    List.add(E元素)
    扩展,因为
    List
    扩展了
    Collection
    。因此,您还必须考虑
    Collection.add(E元素)
    javadoc。它可能会增加其他方面。然而,您也可以构建测试的层次结构来覆盖这一点。例如,
    LinkedListTest
    扩展了
    AbstractListTest
    扩展了
    AbstractCollectionTest
    。然后,您可以将每个接口的测试方面放在适当的抽象测试类中

    public class LinkedListTest {
    
        /**
         * adding <code>null</code> must be possible.
         */
        @Test
        public void addNullElement() {
            LinkedList<Integer> list = new LinkedList<Integer>();
    
            boolean added = list.add(null);
            assertTrue("expected that null was added", added);
        }
    
        /**
         * adding a not <code>null</code> element must return <code>true</code>.
         */
        @Test
        public void addNotNullElement() {
            LinkedList<Integer> list = new LinkedList<Integer>();
    
            boolean added = list.add(Integer.valueOf(1));
            assertTrue("expected that element was added", added);
        }
    
        /**
         * add must append element to the end of the list
         */
        @Test
        public void addElementToTheEndOfTheList() {
            LinkedList<Integer> list = new LinkedList<Integer>();
            list.add(1);
            list.add(2);
    
            Integer firstElement = list.get(0);
            assertEquals("expected first element to be 1", Integer.valueOf(1),
                    firstElement);
    
            Integer secondElement = list.get(1);
            assertEquals("expected first element to be 2", Integer.valueOf(2),
                    secondElement);
        }
    
    }