У меня есть простой кэш в памяти, который выглядит (упрощенно) ниже:
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 и передать егоКонструктор кэша.Тогда все операции Set
произойдут в экземпляре карты, который я передал, и я могу проверить, сработал ли Set
как ожидалось.
Но я не совсем уверен, правильный ли это подход.
Точно так же я хочу, чтобы была возможность тестировать Get
, не завися от Set
.