【问题标题】:Junit test casesJunit 测试用例
【发布时间】:2026-02-23 05:15:01
【问题描述】:

我正在为此代码编写测试用例。

但我无法为此编写 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);
    }
}

}

【问题讨论】:

  • 您能详细说明您遇到了什么问题吗?

标签: java maven junit


【解决方案1】:

你不需要在这里嘲笑。

您的 CUT(被测类)具有非常清晰的语义;以及基本上指导您编写测试用例的接口。你必须做的:创建你的缓存类的对象;然后使用它的方法来修改它;并断言验证。

例子:

@Test
public void testNewCacheIsEmpty() {
  BasicCache underTest = new BasicCache();
  assertThat(underTest.isEmpty(), is(true));

}

(如果你还没有 isEmpty(),你可以添加一个作为包保护方法;只是为了允许这样的测试)。

然后你编写其他测试;例如,确保添加某个缓存键 ... 确实符合您的预期。

所以,这里要理解的主要:你应该设计你的整个缓存,以便你可以测试它......而不知道它到底在做什么。

当然,您可以创建一个模拟 ConcurrentHashMap 对象并将其传递给您的类;验证您期望执行某些操作的那些调用确实发生了。但这意味着:测试实现细节。如果可能的话,你想避免这种情况。

仅作记录:您的字段 defaultCache 在您显示的代码中没有任何意义。最初为 null,没有设置器;所以它绝对没有目的。

【讨论】: