我有以下的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);
}
答案 0 :(得分:4)
首先,您是否知道可以用friendList.remove(rf);
替换整个方法?它将完全方法名称所声称的内容(并且保证已经过全面测试)。
至于测试,即使是最纯粹的“纯粹”单元测试的教条支持者也没有声称OO语言中每个类的方法必须完全隔离才能测试。否则,您根本无法测试OO代码,单元测试将仅限于函数式语言。
因此,您在测试中所做的是创建包含该方法的类的对象,使用其构造函数或setter将其置于该方法可以操作的特定状态,然后调用该方法然后测试该对象之后处于预期状态。更具体地说:
friendList
removeFriend()
答案 1 :(得分:2)
大概是friendList是定义方法的类的字段。
所以要测试:
您可能还希望通过为不在列表中的朋友传递字符串来进行测试,以声明列表未更改。
编辑:这是你在评论中提出的一个有趣的问题。我通常非常清楚这些事情,所以我会做
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:你的方法
我会为所有这些条件写一个测试。
要寻找的重要一点是你的方法可能会破坏的所有条件,而不仅仅是它可能有效的情况。
答案 3 :(得分:0)
向这个对象添加一些朋友,断言他们在那里。调用removeFriend(),断言你删除的那个不存在。
答案 4 :(得分:0)
您可能会发现学习“按合同编程”的课堂设计风格很有帮助。它适用于“测试驱动开发”(TDD)风格。简而言之,您只是根据其可访问(公共和受保护)getter方法返回的值来描述和记录mutator方法的意图。