我正在编写此代码的测试用例。
但是我无法为此编写junit测试用例。我有问题为此编写junit测试用例。
请为此编写mockito或junit测试用例。
public class BasicCacheManager implements CacheManager {
private ConcurrentHashMap<String, BasicCache> cacheMap;
private String defaultCache;
public BasicCacheManager() {
this.cacheMap = new ConcurrentHashMap<String, BasicCache>();
}
public BasicCacheManager(List<String> cacheNames) {
this.cacheMap = new ConcurrentHashMap<String, BasicCache>();
addCache(cacheNames);
}
@Override
public BasicCache getCache(){
return getCache(defaultCache);
}
@Override
public BasicCache getCache(String name) {
return cacheMap.get(name);
};
@Override
public void addCache(BasicCache cache) {
cacheMap.put(cache.getName(), cache);
};
@Override
public void removeCache(String name) {
cacheMap.remove(name);
};
@Override
public void removeAll() {
cacheMap = new ConcurrentHashMap<String, BasicCache>();
};
@Override
public boolean cacheExists(String name) {
return cacheMap.containsKey(name);
};
@Override
public void removeElement(String cacheName, String element){
BasicCache cache = getCache(cacheName);
if(cache != null){
cache.remove(element);
}
}
// added final to avoid any child classes from overriding this method
private final void addCache(List<String> cacheNames) {
for (String cacheName : cacheNames) {
BasicCache cache = new BasicCache(cacheName);
addCache(cache);
}
}
}
答案 0 :(得分:1)
你不需要在这里嘲笑。
你的CUT(被测试的类)具有非常明确的语义;和基本指导你编写测试用例的接口。你需要做的是:创建缓存类的对象;然后使用它的方法来修改它;并断言要验证。
示例:
@Test
public void testNewCacheIsEmpty() {
BasicCache underTest = new BasicCache();
assertThat(underTest.isEmpty(), is(true));
}
(如果你还没有isEmpty(),你可以将它添加为受包保护的方法;只是为了允许这样的测试)。
然后你写其他测试;例如,确保添加某个缓存键...实际上做了你期望的事情。
所以,主要在这里要理解:您应该设计整个缓存,以便可以测试它...而不知道它到底在做什么。
当然,你可以创建一个模拟的 ConcurrentHashMap对象并将其传递给你的类;验证确实发生了某些操作所期望的那些调用。但这意味着:测试实施细节。如果可能的话,你想避免这种情况。
仅供记录:您的字段 defaultCache 在您显示的代码中没有任何意义。它最初为null,没有setter;所以它绝对没有没有目的。