【发布时间】:2019-05-10 12:54:36
【问题描述】:
我知道有很多关于模拟和测试的问题,但我没有找到任何对我有完美帮助的问题,所以我仍然无法理解以下内容:
如果我弄错了,请纠正我,但据我所知,单元测试用于单独测试一个特定类的业务逻辑,如果需要来自外部的任何对象,它们将被模拟。 因此,例如,如果我有一个简单城市公民的管理系统,它将公民添加到列表中并按其姓名返回公民(假设:公民仅包含一些基本的个人信息),如下所示:
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?
如果它们被模拟,我将如何测试该方法以通过其名称获取对象,因为模拟对象不包含参数?
【问题讨论】:
-
如果你写的是
TestProcessClass,你不应该模拟ProcessClass,因为它是你正在测试的。我假设在这种情况下Citizen是一个没有逻辑的数据类,所以没有必要模拟它。但是,如果您使用另一个具有逻辑的类,请考虑模拟它 -
这真的取决于您要测试的内容。如果您尝试测试
addCitizen方法,则无需创建模拟公民对象。但是,如果您尝试测试getByName方法,我会说您可以创建一个具有名称的模拟公民并将其分配给您的ProcessClass,然后测试getByName。模拟是大多数使用的白色服务。例如,如果您想测试一个在没有实际数据库的情况下访问数据库的类。 -
如果
Citizen只是一个简单的数据类,我会创建它们。一般来说,如果可以的话,最好避免嘲笑。模拟对服务和依赖项很有用。 -
好吧,这有点牵涉到这个问题:由于 Citizen 不包含任何逻辑,它可以在 ProcessClassTest 中使用,或者包含这些非逻辑类是否违反隔离像他们一样?
标签: java unit-testing