vei*_*oen 2 tdd unit-testing mocking
我正在编写程序参数解析器,只是为了在TDD中变得更好,我坚持以下问题.说我的解析器定义如下:
class ArgumentsParser {
public ArgumentsParser(ArgumentsConfiguration configuration) {
this.configuration = configuration;
}
public void parse(String[] programArguments) {
// all the stuff for parsing
}
}
Run Code Online (Sandbox Code Playgroud)
我想像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.
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的阶段.目前在测试中我使用:
@Test
public void shouldResultWithOneAvailableArgument() {
ArgumentsConfiguration config = prepareSampleConfiguration();
config.addArgument("mode", Integer.class);
ArgumentsParser parser = new ArgumentsParser(configuration);
parser.parse();
// ....
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这样的方式是否正确?我的意思是,在测试中使用真正的ArgumentsConfiguration是否可以?或者我应该嘲笑它?默认(当前)实现非常简单(只是包装Map),但我想它可能更复杂,比如从数据源类型中获取配置.那么模仿这种"昂贵"的行为是很自然的.但这里有什么首选方式?
编辑:也许更清楚:我是否应该模拟ArgumentsConfiguration,即使没有编写任何实现(只需定义其公共方法),使用mock进行测试并稍后处理实际实现,或者我应该在测试中使用最简单的实现,并让它们间接地涵盖这个实现.但如果是这样,那么测试后面提供的另一个配置实现呢?
那么模仿这种"昂贵"的行为是很自然的.
这不是重点.你不是在嘲笑复杂的课程.
你嘲笑完全隔离类.
完全隔离确保测试证明类遵循其接口并且没有隐藏的实现怪癖.
此外,完全隔离使得调试失败的测试变得更加容易.它可以是测试,被测试的类或模拟对象.理想情况下,测试和模拟非常简单,不需要任何调试,只留下测试类.
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |