java.lang.IllegalStateException:找不到ApplicationContext,请先正确配置Grails

java.lang.IllegalStateException:找不到ApplicationContext,请先正确配置Grails,grails,mocking,integration-testing,spock,grails-domain-class,Grails,Mocking,Integration Testing,Spock,Grails Domain Class,我在Grails2.4.3中进行了以下spock集成测试,我在google上搜索过,但没有找到任何可以理解的内容 @Mock([Product,Price]) class ProductViewerSpec extends IntegrationSpec { ProductController productController = new ProductController() void "Test the complete flow of retrieving and viewing a

我在Grails2.4.3中进行了以下spock集成测试,我在google上搜索过,但没有找到任何可以理解的内容

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

有人能告诉我出了什么问题吗?

这可能与您使用@Mock注释进行集成测试有关@Mock仅用于单元测试

在文件中:


您将看到单元测试部分中描述了测试混合。

您将要添加价格/产品类。例如,价格是一个域吗?如果是的话。。你为什么不把它放在模拟陈述中?这是什么版本的Grails(我注意到您没有使用@Integration注释,而是使用IntegrationSpec)?为什么这需要一个集成测试,而不是一个单元测试?是的,Price是一个域,我也尝试过在mock中添加它,但它不起作用。我正在使用Grails2.4.3。我使用IntegrationSpec是因为我只找到了这方面的示例。我已经更新了问题。我已经删除了@Mock注释,但现在我得到了NullPointerException,我现在如何在测试中模拟域类?事实上,我正在测试中调用的服务方法中执行Product.createCriteria().list(params)。这实际上解决了我的问题,我从集成测试中删除了
@Mock
注释,它成功了!!谢谢@loteq
| 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