【发布时间】:2011-06-27 19:52:05
【问题描述】:
我正在编写程序参数解析器,只是为了在 TDD 中做得更好,但我遇到了以下问题。假设我的解析器定义如下:
class ArgumentsParser {
public ArgumentsParser(ArgumentsConfiguration configuration) {
this.configuration = configuration;
}
public void parse(String[] programArguments) {
// all the stuff for parsing
}
}
我想有 ArgumentsConfiguration 实现,如:
class ArgumentsConfiguration {
private Map<String, Class> map = new HashMap<String, Class>();
public void addArgument(String argName, Class valueClass) {
map.add(argName, valueClass);
}
// get configured arguments methods etc.
}
这是我目前的阶段。现在我在测试中使用:
@Test
public void shouldResultWithOneAvailableArgument() {
ArgumentsConfiguration config = prepareSampleConfiguration();
config.addArgument("mode", Integer.class);
ArgumentsParser parser = new ArgumentsParser(configuration);
parser.parse();
// ....
}
我的问题是这种方式是否正确?我的意思是,可以在测试中使用真正的 ArgumentsConfiguration 吗?还是我应该嘲笑它?默认(当前)实现非常简单(只是包装了 Map),但我想它可能会更复杂,比如从某种数据源中获取配置。那么嘲笑这种“昂贵”的行为是很自然的。但是这里的首选方式是什么?
编辑: 也许更清楚:我是否应该在不编写任何实现的情况下模拟 ArgumentsConfiguration(只需定义其公共方法),使用模拟进行测试并稍后处理实际实现,还是应该在测试中使用最简单的,让他们覆盖这个间接实施。但是如果是这样,那么测试稍后提供的另一个配置实现呢?
【问题讨论】:
标签: unit-testing tdd mocking