我知道有很多关于模拟和测试的问题,但我找不到完全帮助我的答案,所以我仍然不理解以下内容:
请纠正我如果我理解错误,但据我所见,单元测试用于测试一个特定类的业务逻辑并将需要从外部获取的任何对象进行模拟。
例如,如果我有一个简单城市的公民管理系统,该系统将公民添加到列表中并按其名称返回公民(假设:公民只包括几个基本个人信息),如下所示:
请纠正我如果我理解错误,但据我所见,单元测试用于测试一个特定类的业务逻辑并将需要从外部获取的任何对象进行模拟。
例如,如果我有一个简单城市的公民管理系统,该系统将公民添加到列表中并按其名称返回公民(假设:公民只包括几个基本个人信息),如下所示:
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
视为需要进行 Mock 的外部功能?或者只是为了测试目的而创建一个 Citizen
对象?如果需要 Mock,那么如何测试按名称获取对象的方法,因为 Mock 对象不包含参数?
TestProcessClass
,那么你不应该模拟ProcessClass
,因为这就是你要测试的内容。我假设在这种情况下,Citizen
是一个没有逻辑的数据类,所以没有必要模拟它。然而,如果你使用另一个带有逻辑的类,请考虑模拟它。 - DanielMaddCitizen
方法,你不需要创建一个模拟公民对象。但是,如果你想测试getByName
方法,我会建议你创建一个带有名称的模拟公民,并将其分配给你的ProcessClass,然后测试getByName
。Mock主要用于服务。例如,如果你想测试一个访问数据库但没有实际数据库的类。 - NicolasCitizen
只是一个简单的数据类,我会直接创建它们。一般而言,如果可以避免使用模拟对象就最好不要使用,因为模拟对象主要用于服务和依赖项。 - Boris the Spider