2017-09-08 4 views
1

J'ai un simple service de Grails:IllegalStateException Exécution Grails Unité des services Tests

@Transactional 
class SearchService { 
    def doSomething() { 
     10 
    } 
} 

avec une unité simple test:

class SearchServiceSpec extends Specification implements ServiceUnitTest<SearchService>{ 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test something"() { 
     expect: 
     service.doSomething() == 10 
    } 
} 

Quand je lance le test, je reçois l'exception suivante:

enter image description here

Quelqu'un sait ce que cela signifie?

Chose étrange est-ce fonctionne si je change doSomething à getSomething, puis faites service.something. J'ai les versions suivantes: | Grails Version: 3.3.0 | Groovy Version: 2.4.11 | Version JVM: 1.8.0_60

+0

En utilisant une méthode « get » est exactement ce qu'ils ont dans la documentation: https://testing.grails.org/latest/guide/index.html#unitTestingServices Ajouter une annotation @Mock() à votre classe et il devrait câbler GORM et travailler. (Grails avant 3.3). Je ne sais pas comment ils l'ont changé en 3.3. – bassmartin

Répondre

3

Cela est dû au fait que la méthode getter n'a pas de comportement transactionnel appliqué. Pour tester une méthode transactionnelle, vous devez disposer d'une configuration d'implémentation GORM. La façon la plus simple de le faire pour votre test est de mettre en œuvre grails.testing.gorm.DataTest.

+1

Ce serait bien d'avoir ceci documenté dans la documentation officielle dans la section 'services de tests unitaires'. Puisque les services sont générés avec un comportement transactionnel par défaut, c'est un fait important à avoir dans la documentation. – bassmartin

+0

Ensuite, je vous encourage à soumettre un PR à la documentation. –

+0

Si ma réponse a suffisamment répondu à votre question, veuillez la marquer comme acceptée –