2016-07-28 1 views
0

私のspockテストの1つがwhen節をスキップして、then節に右に移動しています。私は次のような結果を得るSpockはwhen節を実行しません

@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

したがって、when句を実行する前に、Spockは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"] | _ 

} 
関連する問題