2013-12-05 2 views
3

Я недавно обновился до Grails 2.3 и попытаюсь перенести все старые тесты на тест интеграции интеграции. Но он не работает при очистке, потому что мой тест не является транзакционным. В документе Grails doc говорится, что тест может быть не транзакционным, но мы должны обрабатывать его вручную, но это кажется не совсем правильным. как я получаю эту ошибку во всех тестах интеграции, простирающейся IntegrationSpecGrails 2.3 IntegrationSpec не может быть транзакционным false

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

Я побежал в это тоже! Довольно уверен, что его ошибка в граале ... Я представил jira и patch.

Ошибка генерируется, потому что код в 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. Не идеально ... но он работает :)

2

Grails 2.3 корабли по умолчанию со Спок. Просто удалите свою собственную определенную зависимость spock, чтобы импортировать файл grails.test.spock.IntegrationSpec, и он должен работать.