packagefixture.sandboxclassBook{StringtitleDatepublishedBigDecimalpricestaticbelongsTo=[author:Author]staticconstraints={title(blank:false)published(nullable:false)price(nullable:false,scale:2,min:5.95asBigDecimal)author(nullable:false)}@OverrideStringtoString(){"$title published on $published by $author costs $$price"}}
importfixture.sandbox.Book// 他の定義ファイルをincludeできるinclude'authors'fixture{groovyInAction(Book){title='Groovy in Action'published='2007/01/10'price=39.99author=dierk// author.groovyで定義したAuthor}grailsInAction(Book){title='Grails in Action'published='2009/06/10'price=35.99author=glen// author.groovyで定義したAuthor}}// Build Test Data Pluginを組み合わせて使えるbuild{sampleBook(Book)}
こんな感じで1つ1つに名前を付けて使います。Build Test Data Pluginはどちらかと言うと大量データ生成向けですが、こちらは特定条件の値を作りたいときに使うといいですね。
packagefixture.sandboximportgrails.plugin.spock.IntegrationSpecimportspock.lang.SharedclassGrailsFixturesSpecextendsIntegrationSpec{@ShareddeffixtureLoader@ShareddeffixturedefsetupSpec(){// ファイルからロードfixture=fixtureLoader.load('books')// インラインでロードfixtureLoader.load{makingJavaGroovy(Book){title='Making Java Groovy'published='2013/05/01'price=35.99author=ref('kenneth')// ref()で後ろに定義したものも参照可能}kenneth(Author){firstName='Kenneth'lastName='Kousen'}}}def'setupSpecでロードしたフィクスチャーが生成されること(ファイル版)'(){when:defgroovyInAction=Book.findByTitle('Groovy in Action')then:'設定した通りに保存されている'groovyInAction.published==newDate('2007/01/10')groovyInAction.price==39.99and:'関連も問題なし'groovyInAction.author.firstName=='Dierk'groovyInAction.author.lastName=='König'}def'setupSpecでロードしたフィクスチャーが生成されること(インライン版)'(){when:defgroovyInAction=Book.findByTitle('Making Java Groovy')then:'設定した通りに保存されている'groovyInAction.published==newDate('2013/05/01')groovyInAction.price==35.99and:'関連も問題なし'groovyInAction.author.firstName=='Kenneth'groovyInAction.author.lastName=='Kousen'}def'Build Test Data Pluginとの統合'(){expect:'プラグインによるフィールド値の設定が行われている'fixture.sampleBook.title=='title'fixture.sampleBook.price==5.95fixture.sampleBook.published!=nulland:'関連も問題なし'fixture.sampleBook.author.firstName=='firstName'fixture.sampleBook.author.lastName=='lastName'and:'永続化されているのでidとversionが払い出されている'fixture.sampleBook.id!=nullfixture.sampleBook.version!=null}}