gpt4 book ai didi

testing - 如何组织和测试这段代码?

转载 作者:行者123 更新时间:2023-11-28 21:25:18 26 4
gpt4 key购买 nike

我对如何组织和测试如下代码存在概念性疑问,其中对辅助方法的调用是该类所有公共(public)方法的第一条指令。我的想法是让代码干净且可测试。

该代码是一个示例,试图通过“缓存”类来说明这一点。这个类有一个可选的前缀,如果它被设置将应用于缓存中的所有键。

import java.util.HashMap;


public class Cache {
private HashMap<String, Integer> inMemoryCache;
private String prefix;


public Cache() {
this.inMemoryCache = new HashMap<String, Integer>();
prefix = null;
}

public void setPrefix(String prefix) {
this.prefix = prefix;
}

public int getValue(String key) throws NullPointerException {
String prefixedKey = applyPrefixOrDefault(key);
return inMemoryCache.get(prefixedKey);
}

public void setValue(String key, int value) {
String prefixedKey = applyPrefixOrDefault(key);
inMemoryCache.put(prefixedKey, value);
}

public boolean isCached(String key) {
String prefixedKey = applyPrefixOrDefault(key);
return inMemoryCache.containsKey(prefixedKey);
}

private String applyPrefixOrDefault(String key) {
if (prefix == null) {
return key;
} else {
return prefix + key;
}
}


public static void main (String[] arg) {
Cache cache = new Cache();
cache.setPrefix("global:");
cache.setValue("id", 4);
int value = cache.getValue("id");
System.out.println(value);
}
}

这段代码向我提出了两个问题:

  1. 如果我有很多访问内部哈希表的方法,将一个类中的缓存行为与其他类中的前缀行为分开是否正确?

  2. 测试这个的最干净的方法是什么?如果我们不考虑前缀,测试 getValue、setValue 和 isCached 很简单。使用前缀,我们需要测试两件事,缓存的正确内部行为,我们还需要测试所有方法在访问数据之前调用 applyPrefixOrDefault。

这是一个常见的用例,我确信一定有一些设计模式来组织它。有什么想法吗?

最佳答案

在我看来,我们在这里错过的是一个让我们设置缓存状态的构造函数。所以我会添加一个如下:

public Cache() {
this(null, new HashMap<String, Integer>());
}

public Cache(String prefix, Map<String, Integer> cache) {
this.prefix = prefix;
this.inMemoryCache = cache;
}

使用这个新的构造函数,您应该能够为每个可能的缓存状态编写测试用例。我还会将 applyPrefixOrDefault 方法的可见性更改为 protected 或 package,以便测试代码可以访问它。例如,要测试 GetValue 方法,我会这样写:

public class EmptyCacheTests {

private final Map<String, Integer> memory;
private final String prefix;
private final Cache cache;

public EmptyCacheTests() {
this.memory = new HasMap<String, Integer>();
this.prefix = "foo";
this.cache = new Cache(prefix, memory);
}

public void testGetValue() {
String key = this.cache.applyPrefixOrDefault("bar")
this.memory.put(key, 50);
result = this.cache.getValue("bar");
assertEquals(50, result, "The value retrieved is wrong!");
}
}

这里的要点是,它允许测试设置缓存的内部状态,这样我们就可以针对许多不同的缓存进行测试。

关于testing - 如何组织和测试这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42341913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com