您可以在不嘲笑的情况下演示TDD。事实上,嘲弄可能会混淆TDD新手。我会简单地从测试中开始,尝试开发您正在尝试开发的功能,然后再担心嘲笑。让我们假设你已经测试驱动的数字为英语转换器(它不会出现你这样做又根据您的描述),你有一个类,看起来是这样的:
public class NumberConverterTest { ... }
public class NumberConverter {
public String toEnglish(int number) { ... }
}
你很可能也有一些主类:
public class NumberConverterMain {
public void main(String[] args) {
NumberConverter converter = new NumberConverter();
System.out.println(converter.toEnglish(args[0]);
}
}
你现在已经演示了TDD没有嘲笑。在尝试TDD时,嘲讽问题总会出现。为了演示模拟,您可以在toEnglish
方法中添加一些任意的业务规则,例如“所有大于1000的数字请求都必须记录到大数部门”。知道大量部门托管在另一台我们不想依赖的服务器上,我们可以测试驱动界面并将其模拟出来。
public class NumberConverterTest {
// ..
@Test public void theLargeNumberDepartmentIsNotifiedForLargeNumbers() {
LargeNumberDepartment department = new MockLargeNumberDepartment(1000);
NumberConverter converter = new NumberConverter(department);
converter.toEnglish(1000);
assertTrue(department.wasNotifiedWith(1000));
}
public static MockLargeNumberDepartment implements LargeNumberDepartment {
private int valueRequested;
public void MockLargeNumberDepartment(int threshhold) {
this.threshold = threshold;
}
public int notificationThreshold() {
return this.threshold;
}
public void largeNumberReceived(int value) {
valueRequested = value;
}
public boolean wasNotifiedWith(int value) {
assertEquals(value, valueRequested);
return true;
}
}
}
// In NumberConverter.java
public class NumberConverter {
public NumberConverter(LargeNumberDepartment department) {
this.department = department;
}
public String toEnglish(int value) {
if(value > department.notificationThreshold())
department.largeNumberReceived(value);
return convertIt(value);
}
}
嘲笑通常用于模拟别的东西。你想要模拟什么?输出机制? – 2012-03-11 17:34:14
如果你想演示TDD,你应该丢掉你的代码并开始编写测试。 – 2012-03-11 17:45:58
@vaughan:这是我的问题。我的程序可以很容易地编写而不用嘲笑,但是我需要用一种方式来写作,以演示嘲笑。因此,我需要这样设计它。设计显然会令人费解,但这个练习是为了展示嘲笑。 – TheCoder 2012-03-11 17:57:52