Вы можете продемонстрировать 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);
}
}