Как сбалансировать Framework/API Design и TDD

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

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

Мы могли бы:

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

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


person Simon Munro    schedule 29.10.2008    source источник


Ответы (3)


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

Удачи.

person Ricardo Villamil    schedule 29.10.2008

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

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

person Ilja Preuß    schedule 01.11.2008

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

[1l

person dove    schedule 29.10.2008