Grails 2.3 IntegrationSpec не может быть транзакционным ложным
Недавно я обновляюсь до Grails 2.3 и пытаюсь перенести все старые тесты, чтобы испортить интеграционный тест. Но это не помогает при очистке, потому что мой тест не транзакционный. Док Grails говорит, что тестирование может быть не транзакционным, но нам нужно обрабатывать его вручную, но здесь это не совсем так. как я получаю эту ошибку в каждом интеграционном тесте, расширяющем IntegrationSpec
java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active
at grails.test.spock.IntegrationSpec.cleanup(IntegrationSpec.groovy:72)
Простой тест, подобный этому, выдает эту ошибку:
import grails.test.spock.IntegrationSpec
public class DummySpec extends IntegrationSpec {
static transactional = false
def setup() {
}
def cleanup() {
}
def testDummy() {
expect:
1 == 1
}
}
2 ответа
Я столкнулся с этим тоже! Уверен, это ошибка Грааля... Я представил джира и патч.
Ошибка выдается, потому что код в grails.test.spock.IntegrationSpec не проверяет interceptor.isTransactional()
перед звонком interceptor.destroy()
def cleanup() {
perMethodRequestEnvironmentInterceptor?.destroy()
perMethodTransactionInterceptor?.destroy() //breaks :(
}
...
private GrailsTestTransactionInterceptor initTransaction() {
def interceptor = new GrailsTestTransactionInterceptor(applicationContext)
if (interceptor.isTransactional(this)) interceptor.init() //also need for destroy()
interceptor
}
Я решил добавить этот код:
def cleanup() {
perMethodRequestEnvironmentInterceptor?.destroy()
destroyTransaction(perMethodTransactionInterceptor)
}
...
private void destroyTransaction(GrailsTestTransactionInterceptor interceptor){
if (interceptor?.isTransactional(this)) interceptor.destroy()
}
Чтобы обойти это сейчас, вы можете просто создать свой собственный com.myname.IntegrationSpec с исправленным кодом и расширить его вместо grails.test.spock.IntegrationSpec. Не идеально... но это работает:)
Grails 2.3 поставляется по умолчанию со Споком. Просто удалите свою собственную определенную зависимость спока, убедитесь, что импортировали grails.test.spock.IntegrationSpec, и она должна работать.