2011年10月11日

Grails 2.0.0M 的 Spock Testing with Mock Domain Object

Grails 2.0.0M 雖然內建 spock plugin,但版本 0.5 仍有些問題,必須先升級成 0.6-SNAPSHOT。

grails install-plugin spock 0.6-SNAPSHOT

修改 grails-app/conf/BuildConfig.groovy

grails.project.dependency.resolution = {
  plugins {
    //增加以下
    test ":spock:0.6-SNAPSHOT"
  }
}

接著建立一個 Unit Test:

grails create-unit-test Book

新檔案內容大概是:

import spock.lang.*
import grails.plugin.spock.*

class BookSpec extends UnitSpec {

    def "feature method"() {

    }
}

直接執行測試會發生問題:

grails test-app

The return type of java.lang.Object mockDomain(java.lang.Class, java.util.List) in BookSpec is incompatible with void mockDomain(java.lang.Class, java.util.List) in grails.plugin.spock.UnitSpec

必須手動將 Test Class 修改以下。

import spock.lang.*
import grails.plugin.spock.*
import grails.test.mixin.*

@Mock(Book)
class BookSpec extends Specification {
  def "book test"() {
    setup:

    when:
    new Book(name: name).save()

    then:
    Book.findByName(name) != null

    where:
    name = 'title1'
  }
}

主要差異是必須用 Specification (Spock 的標準寫法) 取代舊版 Grails spock 的 UnitSpec,並且用 @Mock 的 annotation 取代 mockDomain() 的舊方法。

如此一來,便可以用語意更加清晰的 Spock Specification 取代 JUnit 風格的 Test Case 寫法。

Happy Grails !!!

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!