我有一个简单的内存缓存,如下所示(简化):
class Cache {
private Map<String, Integer> m = new HashMap<>();
public String get(String key) {
if(!m.containsKey(key))
return null;
return m.get(key);
}
public void set(String key, String value) {
m.put(key, value);
}
public Set<String> getKeys() {
return m.keySet();
}
}
现在,我想为此类编写单元测试。我当时想我可以按照以下方式做些事情:
[TestMethod]
public void Get_Success() {
Cache c = new Cache();
c.set("Apple", 1);
c.set("Grape", 2);
c.set("Banana", 3);
Assert.Equals(1, c.get("Apple"));
Assert.Equals(2, c.get("Grape"));
Assert.Equals(3, c.get("Banana"));
}
但是问题是,它同时测试Set
和Get
方法。因此,如果测试失败,我将不知道该错误是在Set
还是Get
中。
建议分别测试Get
和Set
方法的方法是什么?
我认为的一种方法是,修改Cache
类以接受一个Map<String, Integer>
实例,例如:
class Cache {
private Map<String, Integer> m = new HashMap<>();
public Cache(Map<String, Integer> m) {
this.m = m;
}
...
...
}
然后从测试中,我可以创建Map的实例并将其传递给Cache构造函数。然后,所有Set
操作都将在我传递的地图实例中发生,并且我可以验证Set
是否按预期工作。
但是我不太确定这是否是正确的方法。
同样,我也希望能够不依赖Get
来测试Set
。