grails - Spock不执行when子句

标签 grails groovy spock

我的spock测试之一是跳过when子句,然后直接移到then子句。

@Unroll
void "test refresh metadata with #consumerNames"() {
    setup:
    consumerNames.each {
        new CredentialConsumer(name: it).save(validate: false)
    }

    when:
    service.refreshMetadata()

    then:
    consumerNames.each { consumerName ->
        Metadata metadata = new Metadata(content: "Metadata for $consumerName")
        ConsumerDefinition consumerDefinition = new ConsumerDefinition(name: consumerName, metadata: metadata)
        1 * mockApplicationLibraryService.fetchConsumerDefinition(consumerName) >> consumerDefinition
        assert CredentialConsumer.findByName(consumerName)?.metadata?.content == metadata.content
    }

    where:
    consumerNames     | _
    ["bacon"]         | _
    ["bacon", "eggs"] | _

}

我得到以下结果...
Condition not satisfied:

CredentialConsumer.findByName(consumerName)?.metadata?.content == metadata.content
                   |          |              |         |       |  |        |
                   |          bacon          null      null    |  |        Metadata for bacon
                   |                                           |  com.datapriviasoftware.completesso.configuration.Metadata@487cd177
                   |                                           false
                   com.datapriviasoftware.completesso.CredentialConsumer : 1

Expected :Metadata for bacon

Actual   :null

当我使用调试器逐步调试它时,它将执行setup子句,跳过when子句,然后立即执行then子句。

最佳答案

因此,我知道Spock在执行then子句之前使用AST转换来处理when子句中的模拟。当我仔细考虑时,我意识到处理then子句中的模拟需要执行整个each循环,因此我需要将显式断言与模拟定义分开。

这有效...

@Unroll
void "test refresh metadata with #consumerNames"() {
    setup:
    consumerNames.each {
        new CredentialConsumer(name: it).save(validate: false)
    }

    when:
    service.refreshMetadata()

    then:
    consumerNames.each { consumerName ->
        Metadata metadata = new Metadata(content: "Metadata for $consumerName")
        ConsumerDefinition consumerDefinition = new ConsumerDefinition(name: consumerName, metadata: metadata)
        1 * mockApplicationLibraryService.fetchConsumerDefinition(consumerName) >> consumerDefinition
    }

    and:
    consumerNames.each { consumerName ->
        assert CredentialConsumer.findByName(consumerName)?.metadata?.content == "Metadata for $consumerName"
    }

    where:
    consumerNames     | _
    ["bacon"]         | _
    ["bacon", "eggs"] | _

}

关于grails - Spock不执行when子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625932/

相关文章:

eclipse - 从Grails 2.0.4升级到2.2.4-交易问题

grails - 除了 Grails 之外,还有轻量级的 Groovy Web 框架吗?

Grails 上传图片

grails - 在Glassfish 4错误上部署Grails应用程序

grails - 如何测试 grails Web 服务的 URL 映射

Grails 如何解析文本文件?

Groovy 将元组/映射扩展为参数

java - File.createTempFile() 出现意外的 Spock MissingMethodException

unit-testing - Grails Controller 单元测试不会将页面呈现为 response.text

grails - Grails测试-在完整测试阶段之前/之后运行代码