У меня возникли проблемы с откатом транзакции в слое обслуживания со следующим:
Граальс 3.3.8
ГОРМ 6.1.10. РЕЛИЗ
У меня есть следующий метод обслуживания:
import grails.gorm.transactions.Transactional
@Transactional(rollbackFor = Exception.class)
class TestingService {
void testServiceMethod(List<Factory> factories) {
try {
factories.each {
if (it.name == 'second') {
throw new Exception('second')
}
it.testField = 'Edited'
it.save()
println(it.name + ' saved')
}
} catch (Exception e) {
println('Exception Caught ' + e)
}
}
}
У меня также есть следующий интеграционный тест:
@Integration
@Rollback
class TestServiceIntSpec extends Specification {
@Autowired
TestingService testingService
def setup() {
}
def cleanup() {
}
void "test something"() {
when:
Factory factoryOne = new Factory(name: "first").save(flush: true)
Factory factoryTwo = new Factory(name: "second").save(flush: true)
List<Factory> factories = [factoryOne, factoryTwo]
testingService.testServiceMethod(factories)
then:
factoryOne.testField == null
factoryTwo.testField == null
}
}
У меня также есть следующий метод контроллера:
class TestController {
TestingService testingService
def index() {
Factory factoryOne = new Factory(name: "first").save(flush: true)
Factory factoryTwo = new Factory(name: "second").save(flush: true)
List<Factory> factories = [factoryOne, factoryTwo]
testingService.testServiceMethod(factories)
println "First Factory: $factoryOne.testField"
println "First Factory: $factoryTwo.testField"
render 'Check Console'
}
}
Я бы ожидал, что тест пройдёт, поскольку я думал, что транзакция будет отменена после того, как я сгенерировал новое исключение, однако it.testField сохраняется? Также, когда я пингую TestController, он выводит factoryOne.testField как «отредактированный». Я правильно понял это из документации?
"Службы включают разграничение транзакций, которое является декларативным способом определения того, какие методы должны быть сделаны транзакционными. Чтобы включить транзакции в службе, используйте преобразование транзакций:
В результате все методы обернуты в транзакцию, и происходит автоматический откат, если метод генерирует исключение (исключение «Проверено» или «Время выполнения») или Ошибка. "
Источник: https://docs.grails.org/latest/guide/services.html#declarativeTransactions
Я не вижу, что я делаю, отличается от этого другого ответа Stackoverflow:
https://stackoverflow.com/a/25739582/6887293
Проблема может быть воссоздана, если потянуть за следующий проект Github и запустить /factory/factory/src/integration-test/groovy/com/mycompany/myapp/TestServiceIntSpec.groovy или pinging / factory / factory / grails-app / controllers /com/mycompany/myapp/TestController.groovy
https://github.com/georgy3k/IntegrationTestRollBack/tree/8addd2b95a8ffa4570e70eccb3b023b0ccfef5aa
Заранее спасибо ...