Как вы балансируете Framework/API Design и TDD?

Мы создаем фреймворк, который будет использоваться другими разработчиками, и на данный момент мы используем множество методов TDD. У нас везде есть интерфейсы, и у нас есть хорошо написанные модульные тесты, которые насмехаются над интерфейсами.

Однако сейчас мы достигаем точки, когда некоторые свойства / методы входных классов должны быть внутренними и невидимыми для наших пользователей инфраструктуры (например, идентификатор объекта). Проблема в том, что мы не можем поместить эти поля / методы в интерфейс, так как интерфейс не описывает доступность.

Мы могли бы:

  1. Все еще используйте интерфейсы и upcast в первой строке метода, но это, кажется, побеждает назначение интерфейсов.
  2. Используйте классы в качестве входных параметров - нарушая правило TDD, что все должно быть интерфейсами
  3. Обеспечить другой уровень, который выполняет некоторый перевод между общедоступными интерфейсами и внутренними интерфейсами.

Существует ли существующий шаблон / подход для решения этой проблемы? Что, по словам людей TDD, должно быть сделано?

3 ответа

Решение

Вы должны быть в состоянии скопировать эти внутренние методы в ваших макетных объектах. И называть их так же, как их называет реальный объект. Затем вы сосредотачиваете свой модульный тест на общедоступном методе, который опирается на тот частный метод, который необходимо протестировать. Если эти внутренние методы вызывают другие объекты или выполняют много работы, вам может потребоваться рефакторинг вашего проекта.

Удачи.

Во-первых, нет общего правила TDD, которое говорит, что все должно быть интерфейсом. Это происходит от определенного стиля, который практикуется не каждым TDDer. См. http://martinfowler.com/articles/mocksArentStubs.html

Во-вторых, вы испытываете дихотомию публики и публикации. Наша команда "решила" эту проблему, представив аннотацию @Published, которая отображается в документации API. Насколько я знаю, Eclipse использует соглашения об именах. К сожалению, я не знаю действительно хорошего решения проблемы.

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

[1л

Другие вопросы по тегам