我知道,大约有嘲讽和测试的许多问题,但我没有发现任何帮助我很好,所以我还是有了解follwing问题:
请纠正我,如果我得到这个错误的,但据我看到的,单元测试用于测试一个特定类的业务逻辑隔离,如果有来自外部的任何需要的对象,他们会被嘲笑。因此,举例来说,如果我有一个简单的城市,增加了公民的列表,并通过他们的名字返回公民的公民管理系统(Assumtion:公民只包含一些基本的个人信息),就像这样:
public class ProcessClass {
ArrayList<Citizen> citizenList = new ArrayList<Citizen>();
public void addCitizen(Citizen citizen) {
citizenList.add(citizen);
}
public Citizen getByName(String name) {
for (Citizen c : citizenList) {
if (c.getName().equals(name)) {
return c;
}
}
return null;
}
}
如果现在我想单元测试我ProcessClass
做我认为Citizen
是必须被嘲笑的外部特征,还是我只是简单地创建一个Citizen
用于测试目的?如果他们被嘲笑,我将如何进行测试,以获得其名称的对象的方法,因为模仿对象不包含参数?
如果他们被嘲笑,我将如何进行测试,以获得其名称的对象的方法,因为模仿对象不包含参数?
你可以嘲笑调用getName
,使用为的Mockito例如:
Citizen citizen = mock(Citizen.class);
when(citizen.getName()).thenReturn("Bob");
这里是你的方法测试的例子
ProcessClass processClass = new ProcessClass();
Citizen citizen1 = mock(Citizen.class);
Citizen citizen2 = mock(Citizen.class);
Citizen citizen3 = mock(Citizen.class);
@Test
public void getByName_shouldReturnCorrectCitizen_whenPresentInList() {
when(citizen1.getName()).thenReturn("Bob");
when(citizen2.getName()).thenReturn("Alice");
when(citizen3.getName()).thenReturn("John");
processClass.addCitizen(citizen1);
processClass.addCitizen(citizen2);
processClass.addCitizen(citizen3);
Assert.assertEquals(citizen2, processClass.getByName("Alice"));
}
@Test
public void getByName_shouldReturnNull_whenNotPresentInList() {
when(citizen1.getName()).thenReturn("Bob");
processClass.addCitizen(citizen1);
Assert.assertNull(processClass.getByName("Ben"));
}
注意:
我会建议嘲讽。比方说,你写的100个测试你实例化一个Citizen
类这样
Citizen c = new Citizen();
而几个月后,你的构造变化采取一种说法,这本身也是一个对象,类City
的实例。现在你要回去和更改所有这些测试,并写:
City city = new City("Paris");
Citizen c = new Citizen(city);
如果你嘲笑Citizen
,开始时,你就不会需要。
现在,因为它是POJO及其GetName方法的构造可能不会改变,而不是嘲讽应该还是好的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句