【发布时间】:2016-08-19 12:07:40
【问题描述】:
我在 grails 2.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)
}
}
当我从命令行运行 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
谁能告诉我哪里错了?
【问题讨论】:
-
您将要添加价格/产品类。例如,Price 是一个域吗?如果是这样.. 你为什么不把它放在 Mock 声明中?这是什么版本的 Grails(我注意到您没有使用 @Integration 注释,而是使用 IntegrationSpec)?为什么这需要是集成测试,而不是单元测试?
-
是的,Price 是一个域,我也尝试将它添加到模拟中,但它没有用。我正在使用 grails 2.4.3。我正在使用 IntegrationSpec,因为我只找到了这样的例子。我已经更新了问题。
标签: grails mocking integration-testing spock grails-domain-class