2

je le test d'intégration de spock suivante dans Grails 2.4.3, j'ai cherché sur google, mais n'a rien trouvé compréhensiblejava.lang.IllegalStateException: Impossible de trouver ApplicationContext, configurer correctement Grails premier

@Mock([Product,Price]) 
class ProductViewerSpec extends IntegrationSpec { 

ProductController productController = new ProductController() 

void "Test the complete flow of retrieving and viewing a product"() { 

    when: "The loadProducts method is executed to get list of products" 
    String barCode = "1" 
    String description = "testProduct" 
    Set<Price> prices = new HashSet<Price>() 
    Product product = new Product(barCode, description, prices) 

    Price price1 = new Price(10 as BigDecimal).save(flush: true, failOnError: true) 
    product.prices.add(price1) 
    Price price2 = new Price(12 as BigDecimal).save(flush: true, failOnError: true) 
    product.prices.add(price2) 
    Price price3 = new Price(14 as BigDecimal).save(flush: true, failOnError: true) 
    product.prices.add(price3) 
    Price price4 = new Price(11 as BigDecimal).save(flush: true, failOnError: true) 
    product.prices.add(price4) 
    Price price5 = new Price(12 as BigDecimal).save(flush: true, failOnError: true) 
    product.prices.add(price5) 

    product.save(flush: true, failOnError: true) 

    productController.productService.setPrices(product) 

    List<Product> productList = productController.productService.loadProducts(product.getBarCode(), null) 

    then: "All prices calculated and returned correctly" 
    Product.count() == 1 
    productList.size() == 1 
    productList.get(0).barCode == barCode 
    productList.get(0).description == description 
    productList.get(0).prices.size() == 5 
    productList.get(0).getAveragePrice() == 11.8 as BigDecimal 
    productList.get(0).getLowestPrice() == 10 as BigDecimal 
    productList.get(0).getHighestPrice() == 14 as BigDecimal 
    productList.get(0).getIdealPrice() == 14.4 as BigDecimal 
    productList.get(0).prices.id.contains(price1.id) 
    productList.get(0).prices.id.contains(price2.id) 
    productList.get(0).prices.id.contains(price3.id) 
    productList.get(0).prices.id.contains(price4.id) 
    productList.get(0).prices.id.contains(price5.id) 
} 
} 

Je reçois une erreur de suivi lorsque j'exécute grails test-app à partir de la ligne de commande.

| Compiling 1 source files 
| Compiling 1 source files. 
| Running 5 integration tests... 
| Running 5 integration tests... 1 of 5 
| Failure: com.prizypricer.core.ProductViewerSpec 
| java.lang.IllegalStateException: Could not find ApplicationContext, configure Grails correctly first 
at grails.util.Holders.getApplicationContext(Holders.java:97) 
at   grails.test.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy:41) 
| Failure: com.prizypricer.core.ProductLoaderSpec 
| java.lang.IllegalStateException: Could not find ApplicationContext, configure Grails correctly first 
at grails.util.Holders.getApplicationContext(Holders.java:97) 
at  grails.test.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy:41) 
| Completed 1 integration test, 0 failed in 0m 0s 

Quelqu'un peut-il dire ce qui ne va pas?

+0

Vous allez vouloir ajouter les classes prix/produit. Par exemple, Price est un domaine? Si oui, pourquoi ne le mettez-vous pas dans la déclaration de Mock? Quelle version de Grails est-ce (je note que vous n'utilisez pas l'annotation @Integration, mais plutôt IntegrationSpec)? Pourquoi cela doit-il être un test d'intégration plutôt qu'un test unitaire? – billjamesdev

+0

Oui Le prix est un nom de domaine, j'ai essayé de l'ajouter à la maquette, mais cela n'a pas fonctionné. J'utilise des grails 2.4.3. J'utilise IntegrationSpec parce que j'ai trouvé des exemples de ceci seulement. J'ai une question mise à jour. –

Répondre

1

Ceci est probablement lié au fait que vous utilisez l'annotation @Mock avec un test d'intégration. @Mock doit uniquement être utilisé dans les tests unitaires.

Dans la documentation:

http://grails.github.io/grails-doc/latest/guide/testing.html

Vous verrez que les mixins de test sont décrits dans la section d'essai de l'unité.

+0

J'ai supprimé l'annotation @Mock mais maintenant je reçois NullPointerException, comment puis-je simuler la classe de domaine dans le test maintenant? en fait je fais Product.createCriteria(). list (params) dans ma méthode de service qui est appelée à partir du test. –

+0

Cela a effectivement résolu mon problème, j'ai supprimé l'annotation '@ Mock' des tests d'intégration et cela a fonctionné !! Merci @loteq –