Grails: транзакции в интеграционных тестах - PullRequest
5 голосов
/ 26 марта 2012

У меня очень простая настройка - контроллер, который вызывает метод в службе.В этой службе я сохраняю объект в БД, а также отправляю сообщение JMS в очередь - как только оно будет сохранено - с использованием внедренного шаблона JMS.В службе по умолчанию включены транзакции.

При тестировании этого вручную - при отключенном сервере ActiveMQ - возникает исключение и откат транзакции - с полным эффектом того, что объект также не сохраняется в БД,Все хорошо.

Однако, когда я запускаю это через интеграционный тест (с ActiveMQ все еще не работает), утверждаю, что у меня есть возможность проверить, что объект не был сохранен в БД с помощью запроса подсчетапосле того, как я вызову контроллер, произойдет сбой, сказав, что счетчик равен 1. Я подтвердил, что БД не имеет ни одного из этих объектов при запуске теста, добавив еще одно утверждение в начале теста, чтобы убедиться, что счетчик равен 0.

Это ожидаемое поведение (возможно, из-за характера транзакций в среде интеграционного тестирования) или я потенциально делаю что-то не так?Исключение все еще вызывается, потому что сервер JMS не работает - и это RuntimeException.

Интеграционные тесты Grails и транзакции создают впечатление, что этого следовало ожидать - в этом случае,Есть ли какие-либо предложения относительно лучших методов проверки поведения транзакций в интеграционных тестах?

1 Ответ

7 голосов
/ 03 мая 2014

Не уверен, почему все прокомментировали, вместо того, чтобы отвечать, поскольку комментарии действительно раскрывают ответ.Я прыгну и попытаюсь поймать точки ответа!

Да, в тесте Спока весь тест, включая случаи, когда, затем, и т. Д., Завершается одной и той же транзакцией.Таким образом, вы не увидите откат, на который вы надеетесь, до завершения теста.

Вы можете установить свой тест как нетранзакционный, добавив «static transactional = false» вверху класса теста.,Последствия, конечно, в том, что вам нужно будет очистить базу данных после запуска ваших тестов (если для вас важна санация базы данных).Одна большая проблема здесь заключается в том, что в классе Grails IntegrationSpec есть ошибка, которая будет возникать всякий раз, когда вы пытаетесь установить для транзакционного значение false.Эта SO имеет решение этой проблемы:

Grails 2.3 IntegrationSpec не может быть транзакционным ложным

По сути, скопируйте весь код для grails.test.spock.IntegrationSpec всвой собственный класс и замените несколько методов версиями, которые соответствуют транзакционному характеру теста.

...