2016-07-28 44 views
0

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 
        |           | [email protected]77 
        |           false 
        com.datapriviasoftware.completesso.CredentialConsumer : 1 

Expected :Metadata for bacon 

Actual :null 

当我通过它一步与调试器,它执行setup条款,跳过when条款,并立即执行then条款。

回答

0

因此,我知道Spock在执行when子句之前使用AST转换来处理then子句中的模拟。当我想通过它时,我意识到处理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"] | _ 

}