Тестирование взаимодействия с внешними сервисами

предварительные условия: я использую последнюю версию Play! framework, и Java-версию (не Scala).

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

Подход Controller approach

В других фреймворках я бы использовал впрыск конструктора в контроллер и прохождение в издевательской очереди в моих тестах; однако, с Play! контроллеры статичны, это значит, что я не могу сделать новый MyController(mockedQueue) в моих тестах.

Я мог бы использовать Google Guice и поставить @Inject аннотацию на статическое поле в моем контроллере, но это не очень приятно для меня, так как это либо означает, что я должен сделать поле публичным для замены в тесте, либо я должен использовать контейнер в моих тестах. Я бы предпочёл использовать впрыск конструктора, но Play!, похоже, этому не способствует.

Модельный подход

Часто говорят, что ваша логика должна быть в вашей модели, а не в контроллере. В этом есть смысл, однако, мы не в Ruby, и взаимодействие ваших сущностей с внешними сервисами (электронная почта, очереди сообщений и т.д...) значительно менее тестично, чем в динамической среде, где вы можете просто заменить ваши MessageQueue статические вызовы на насмешливый экземпляр по своему усмотрению.

Если я заставлю свою сущность вызывать очередь, как это можно протестировать?

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

Итак, мой вопрос: Как мне смоделировать контроллеры и/или модели Play! для облегчения тестирования взаимодействия с внешними службами?

8
задан James Gregory 18 September 2011 в 16:36
поделиться