Программа для демонстрации TDD + Mocking - PullRequest
0 голосов
/ 11 марта 2012

Мне нужно написать программу, которая берет целое число и преобразует его в английскую версию слова.

Например:

Input:  21
Output: twenty one
Input:  110 
Output: one hundred and ten

Мне нужна программа для демонстрации TDD, поэтому я хочу использовать насмешку.

Я написал класс с функцией преобразования (на основе 2 массивов английских слов). Что мне нужно сейчас, чтобы спроектировать программу таким образом, чтобы я мог продемонстрировать ее с Easymock.

Поэтому мне нужно создать интерфейс, чтобы быть предметом моей насмешки. Кто-нибудь может дать мне какие-нибудь советы о том, как я буду разрабатывать свою программу?

Подойдет ли это?

  1. Напишите класс Converter, который имеет ссылку на интерфейс с именем ConverterInterface. Затем я мог бы смоделировать интерфейс и установить его в свой Converter класс.

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 12 марта 2012

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

Пересмешка обычно полезна только тогда, когда у вас есть некоторое разделение обязанностей между компонентами, где разделение интересов «материализуется» через интерфейс.Ваша заявленная проблема кажется слишком узкой, чтобы проиллюстрировать это.Одна из идей, которая будет работать, заключается в расширении вашей проблемы и разработке переводчика чисел на несколько языков.В этом случае я ожидаю появления шаблона Strategy с интерфейсом INumberTranslator, который предоставляет строковый метод Translate (int number).

Вы могли бы довольно плавно перейти от TDD без насмешек к TDD с насмешками, сначала написав тесты для требований «перевести на английский», а затем изменив требования на «нам нужно поддерживать это и на испанском языке».

0 голосов
/ 11 марта 2012

Во-первых, я согласен с @Don Roby, что лучше всего сначала написать тесты и посмотреть, что получится, как возможность что-то посмеяться.

Я вижу разные элементы этой программы.

  1. Основная исполняемая часть
  2. Логика обработки аргументов командной строки
  3. Алгоритм преобразования чисел в слова
  4. Механизмдля отображения вывода

Первые два могут быть тривиально просты.Третий может быть достаточно сложным, чтобы иметь свой собственный класс.Четвертый может быть тривиально простым для распечатки на консоль, но если бы это была какая-то реальная программа, потенциально было бы полезно абстрагироваться от того, куда он отправляет ответ, чтобы вы могли подключить другие методы, такие как запись в файл илибазы данных или чего-то еще, так что не совсем придумано иметь там интерфейс с конкретной реализацией, которая выполняется отдельно.

...