Java使用JUnit测试方法(void)

时间:2010-12-21 14:03:59

标签: java junit

我有以下的void方法,我不知道如何使用JUnit测试来测试它。

public void removeFriend(String rf)
{
    boolean found = false;
    int i = 0;

    while(i < friendList.size() && !found)
    {
        if(friendList.get(i).equals(rf))
        {
            found = true;
        }
        else{
            i++;
        }
    }

    friendList.remove(i);
}

5 个答案:

答案 0 :(得分:4)

首先,您是否知道可以用friendList.remove(rf);替换整个方法?它将完全方法名称所声称的内容(并且保证已经过全面测试)。

至于测试,即使是最纯粹的“纯粹”单元测试的教条支持者也没有声称OO语言中每个类的方法必须完全隔离才能测试。否则,您根本无法测试OO代码,单元测试将仅限于函数式语言。

因此,您在测试中所做的是创建包含该方法的类的对象,使用其构造函数或setter将其置于该方法可以操作的特定状态,然后调用该方法然后测试该对象之后处于预期状态。更具体地说:

  • 创建班级的对象
  • 将一些条目放入friendList
  • 使用其中一个条目
  • 致电removeFriend()
  • 测试此条目不再存在

答案 1 :(得分:2)

大概是friendList是定义方法的类的字段。

所以要测试:

  1. 创建该类的实例,并填充friendList
  2. 使用应匹配的字符串调用removeFriend。
  3. 断言friendList不再包含该朋友。
  4. 您可能还希望通过为不在列表中的朋友传递字符串来进行测试,以声明列表未更改。

    编辑:这是你在评论中提出的一个有趣的问题。我通常非常清楚这些事情,所以我会做

    List<String> friendList = new ArrayList<String>();
    friendList.add("friend1");
    friendList.add("friend2");
    
    // assert before actually calling the method under test to make sure my setup is ok
    assertEquals(2, friendList.size());
    
    // theObj is an instance of the class you are testing
    theObj.friendList = friendList; 
    
    // call the method under test
    theObj.removeFriend("friend1");
    
    // be explicit, the list should now have size1 and NOT contain the removed friend
    assertEquals(1, friendList.size());
    assertFalse(friendList.contains("friend1");
    

    请注意,我已经遗漏了一些东西,但这是大纲。不要忘记您可以测试删除列表中不存在的字符串的情况。您可能还想测试同一个朋友在列表中两次的情况。

答案 2 :(得分:1)

我认为你的班级有多种方法。在调用此方法之前和之后,您需要使用这些其他方法来测试行为。

BTW:你的方法

    如果找不到匹配项,
  • 似乎会删除第一个条目。这是打算吗?
  • 如果没有条目,
  • 会爆炸。
  • 如果friendList中的任何条目为空,
  • 会爆炸
  • 否则与friendList.remove(rf);
  • 相同

我会为所有这些条件写一个测试。

要寻找的重要一点是你的方法可能会破坏的所有条件,而不仅仅是它可能有效的情况。

答案 3 :(得分:0)

向这个对象添加一些朋友,断言他们在那里。调用removeFriend(),断言你删除的那个不存在。

答案 4 :(得分:0)

您可能会发现学习“按合同编程”的课堂设计风格很有帮助。它适用于“测试驱动开发”(TDD)风格。简而言之,您只是根据其可访问(公共和受保护)getter方法返回的值来描述和记录mutator方法的意图。