以下は私たちが行っていることで、grails 2.0.0 と spock 0.6 で動作しました。
シンプルなドメイン:
package com.grails
class User {
String name, password
def methodWithNoArguments(){
return "Object: methodWithNoArguments"
}
static constraints = {
}
}
ユニット仕様:
package com.grails
import spock.lang.*
import grails.test.mixin.TestFor
import grails.test.mixin.Mock
import grails.test.GrailsMock
@TestFor(UserController) // testing for
@Mock([User]) // collaborators class
UserControllerSpec extends Specification {
// DOES NOT work in 2.2.3 spock 0.7,
// WORKS in grails-2.0.0 spock 0.6
def 'create a Domain collaborator using Mock'() {
given: 'user'
// can't mock this anymore, causes classcast exception.
User user = Mock(User)
user.methodWithNoArguments() >> { "Mock: (3) methodWithNoArguments" }
when: 'we call the method'
def val1 = user.methodWithNoArguments()
then: 'value should be from the mocked method'
val1 == "Mock: (3) methodWithNoArguments"
} }
上記により、grails 2.2.3 および spock 0.7 で次の例外が発生します。注 ( grails-2.0.0 および spock 0.6 で動作します)
| | java.lang.ClassCastException: com.grails.User は、org.spockframework の org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:93) で net.sf.cglib.proxy.Factory にキャストできません。 mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49) org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51) org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java: 44) org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:47) で org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:282) で org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java) :99) com.grails.UserControllerSpec.
互換性のないライブラリがいくつかあるのではないかと考えています。ここに BuildConfig.groovy があります
dependencies {
test "org.spockframework:spock-grails-support:0.7-groovy-2.0"
}
plugins {
runtime ":hibernate:$grailsVersion"
runtime ":jquery:1.8.3"
runtime ":resources:1.2"
build ":tomcat:$grailsVersion"
runtime ":database-migration:1.3.2"
compile ':cache:1.0.1'
test(":spock:0.7") {
exclude "spock-grails-support"
}
}
サンプル テスト アプリは git@github.com:nbostech/grails-spock-2.2.3.git にあります。
git チェックアウト grails-2.0.0; <2.0.0>/bin/grails test-app --unit UserControllerSpec; // すべてのテストに合格
git チェックアウト マスター; <2.2.3>/bin/grails test-app --unit UserControllerSpec; // テストの 1 つが失敗します。