2
私は、Grailsの2.4.3でのために、次のスポックの統合テスト、私はGoogleで検索しましたが理解できる何かを見つけられませんでした

java.lang.IllegalStateExceptionは:のApplicationContextを見つけることができませんでした、Grailsの設定が正しく最初

@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) 
} 
} 

コマンドラインからgrails test-appを実行すると、次のエラーが発生します。

| 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 

誰が間違っていると言うことができますか?

+0

価格/商品クラスを追加することになります。たとえば、価格はドメインですか?もしそうなら..なぜあなたはそれをモックの声明に入れていませんか? Grailsのどのバージョン(これは@Integrationアノテーションを使用せず、代わりにIntegrationSpecを使用しています)これはユニットテストではなく統合テストでなければならないのはなぜですか? – billjamesdev

+0

はい価格はドメインですが、私は擬似でも追加しようとしましたが、うまくいかなかったのです。私はgrails 2.4.3を使用しています。私はこれだけの例を見つけたので、IntegrationSpecを使用しています。私は質問を更新しました。 –

答えて

1

これはおそらく、統合テストで@Mockアノテーションを使用しているという事実にリンクしています。 @Mockはユニットテストでのみ使用されます。ドキュメントで

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

あなたは、テストミックスインは、ユニットテストの項に記載されていることがわかります。

+0

@Mockアノテーションを削除しましたが、現在はNullPointerExceptionが発生しています。ドメインクラスをテストするにはどうすればよいですか?実際に私はProduct.createCriteria()。list(params)をテストから呼び出されたサービスメソッドで処理しています。 –

+0

これは実際に私の問題を解決しました。統合テストから '@ Mock'アノテーションを削除しました。ありがとう@loteq –

関連する問題